查询用户名及用户间共同书籍数量等需求的SQL语句咨询
没问题,我帮你逐个解决这三个SQL查询需求,每个都会附上代码和简单说明:
1. 查询每个用户的读书数量
这里分两种场景,你可以根据需求选择:
场景1:仅统计有读书记录的用户
只返回确实读过书的用户,统计他们的读书数量:
SELECT u.UserID, u.UserName, COUNT(bu.BookID) AS 读书数量 FROM Users u JOIN BookUser bu ON u.UserID = bu.UserID GROUP BY u.UserID, u.UserName ORDER BY 读书数量 DESC;
场景2:包含所有用户(含未读书的用户)
用LEFT JOIN确保所有用户都被纳入统计,没读过书的用户会显示0本:
SELECT u.UserID, u.UserName, COALESCE(COUNT(bu.BookID), 0) AS 读书数量 FROM Users u LEFT JOIN BookUser bu ON u.UserID = bu.UserID GROUP BY u.UserID, u.UserName ORDER BY 读书数量 DESC;
2. 查询阅读相同书籍的其他用户名称
如果是针对某个特定用户(比如UserID = 1),找出和他读过相同书籍的其他用户及对应的书籍:
SELECT DISTINCT u2.UserName, b.BookName FROM BookUser bu1 JOIN BookUser bu2 ON bu1.BookID = bu2.BookID AND bu1.UserID != bu2.UserID JOIN Users u2 ON bu2.UserID = u2.UserID JOIN Books b ON bu1.BookID = b.BookID WHERE bu1.UserID = 1; -- 替换成你要查询的目标用户ID
如果想查看所有用户之间的共同阅读情况(不指定特定用户),可以用这个避免重复配对的版本:
SELECT u1.UserName AS 用户1, u2.UserName AS 用户2, b.BookName AS 共同书籍 FROM BookUser bu1 JOIN BookUser bu2 ON bu1.BookID = bu2.BookID AND bu1.UserID < bu2.UserID JOIN Users u1 ON bu1.UserID = u1.UserID JOIN Users u2 ON bu2.UserID = u2.UserID JOIN Books b ON bu1.BookID = b.BookID ORDER BY 用户1, 用户2;
这里用bu1.UserID < bu2.UserID避免出现A-B和B-A这种重复的配对组合。
3. 查询用户之间的共同书籍数量
统计每对用户之间共同读过的书籍数量,同样避免重复配对和用户自配对:
SELECT u1.UserName AS 用户1, u2.UserName AS 用户2, COUNT(DISTINCT bu1.BookID) AS 共同书籍数量 FROM Users u1 JOIN Users u2 ON u1.UserID < u2.UserID LEFT JOIN BookUser bu1 ON u1.UserID = bu1.UserID LEFT JOIN BookUser bu2 ON u2.UserID = bu2.UserID AND bu1.BookID = bu2.BookID GROUP BY u1.UserID, u1.UserName, u2.UserID, u2.UserName ORDER BY 共同书籍数量 DESC;
如果只想看有共同书籍的用户对,把LEFT JOIN换成JOIN即可,这样没有共同书籍的配对会被过滤掉。
内容的提问来源于stack exchange,提问作者RachelS
相关产品推荐
相关产品推荐

