如何用SQL查询与其他用户拥有相同书籍的UserID?
解决方案
首先先把你的表数据整理成更清晰的格式:
| UserID | Books |
|---|---|
| a | a |
| b | a |
| b | b |
| c | a |
| c | b |
| c | c |
从你期望得到结果a来看,你的需求应该是找出那些只拥有一本书,且这本书同时被其他用户拥有的UserID——毕竟a是唯一符合这个条件的用户:他只有书籍a,而b和c也都拥有a;b和c都持有多本书,不符合“只拥有单本书”的隐含要求。
对应的SQL命令如下(假设你的表名为user_books):
SELECT DISTINCT t1.UserID FROM user_books t1 -- 筛选出仅持有一本书的用户 WHERE (SELECT COUNT(*) FROM user_books WHERE UserID = t1.UserID) = 1 -- 验证该用户的书籍存在其他持有者 AND EXISTS ( SELECT 1 FROM user_books t2 WHERE t2.Books = t1.Books AND t2.UserID != t1.UserID );
简单解释:
- 子查询
(SELECT COUNT(*) FROM user_books WHERE UserID = t1.UserID) = 1用来过滤出只有单本书的用户,这里只有a满足; EXISTS子查询用来确认该用户的书籍确实被其他用户拥有,a的书籍a被b和c持有,所以会被保留;DISTINCT用来避免重复返回同一个UserID(即使你的数据里没有重复记录,加上也更稳妥)。
如果你的需求是字面意思上的“存在至少一本与其他用户相同书籍的UserID”,那对应的SQL会返回a、b、c三个结果,命令如下:
SELECT DISTINCT t1.UserID FROM user_books t1 JOIN user_books t2 ON t1.Books = t2.Books AND t1.UserID != t2.UserID;
但结合你给出的期望结果,第一个SQL应该是你真正需要的。
内容的提问来源于stack exchange,提问作者Teyyihan Aksu
相关产品推荐
相关产品推荐

