You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询用户名及用户间共同书籍数量等需求的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:17:03