PieCloudDB下查找无共同好友的用户好友对SQL语句修正求助
正确SQL实现方案
原SQL的错误在于,它判断的是好友对中的某一个用户是否没有其他好友,而非两个用户是否没有共同好友。当添加(3,6)后,6的好友列表新增了3,原SQL会错误地认为(6,7)存在“其他好友”从而排除它,但实际上6和7并没有共同好友。
以下是针对需求的正确实现,利用CTE整理所有用户的好友关系,再通过子查询判断是否存在共同好友:
WITH user_friends AS ( -- 生成所有用户与好友的双向关系,确保每个用户的所有好友都被列出 SELECT user_id1 AS user_id, user_id2 AS friend_id FROM Friends UNION ALL SELECT user_id2 AS user_id, user_id1 AS friend_id FROM Friends ) SELECT f.user_id1, f.user_id2 FROM Friends f WHERE NOT EXISTS ( -- 检查当前好友对是否存在共同好友 SELECT 1 FROM user_friends uf1 JOIN user_friends uf2 ON uf1.friend_id = uf2.friend_id WHERE uf1.user_id = f.user_id1 -- uf1是当前好友对第一个用户的好友关系 AND uf2.user_id = f.user_id2 -- uf2是当前好友对第二个用户的好友关系 AND uf1.friend_id NOT IN (f.user_id1, f.user_id2) -- 排除用户自身(避免误判) ) ORDER BY f.user_id1, f.user_id2;
逻辑说明:
- CTE
user_friends:将原表的单向好友记录转换为双向,确保每个用户的所有好友都能被查询到(比如原表的(3,6)会同时生成(3,6)和(6,3)两条记录)。 - NOT EXISTS子查询:通过连接两个用户的好友列表,查找是否存在交集(即共同好友)。如果没有交集,则该好友对符合“无共同好友”的条件。
添加(3,6)后,执行该SQL会得到预期结果:
| user_id1 | user_id2 |
|---|---|
| 3 | 6 |
| 6 | 7 |
| 8 | 9 |
内容的提问来源于stack exchange,提问作者lucky
相关产品推荐
相关产品推荐

