如何用SQL自连接获取好友的好友并排除直接好友
解决好友的好友(FOF)排除直接好友的问题
先明确你的场景,咱们先回顾一下你的friends表数据:
| Name | Friend |
|---|---|
| A | B |
| B | C |
| D | B |
| D | C |
| A | E |
| E | Z |
你原来的SQL查询确实能获取到所有好友的好友,但存在一个小问题:部分FOF同时也是用户的直接好友(比如D的FOF里的C,本身就是D的直接好友),需要把这类重复记录排除掉。
方法一:使用NOT EXISTS子查询过滤
这种方法通过子查询检查当前FOF是否属于用户的直接好友,只保留不存在直接好友关系的记录:
SELECT a.Name as Friend, b.Friend as FOF FROM friends a JOIN friends b ON a.Friend = b.Name WHERE NOT EXISTS ( -- 检查当前用户和FOF是否存在直接好友关系 SELECT 1 FROM friends c WHERE c.Name = a.Name AND c.Friend = b.Friend )
方法二:使用LEFT JOIN+IS NULL过滤
通过左连接直接好友表,过滤掉匹配到的直接好友记录,剩下的就是纯FOF:
SELECT a.Name as Friend, b.Friend as FOF FROM friends a JOIN friends b ON a.Friend = b.Name -- 左连接到直接好友关系表 LEFT JOIN friends c ON c.Name = a.Name AND c.Friend = b.Friend -- 只保留没有直接好友关系的FOF记录 WHERE c.Name IS NULL
最终结果说明
执行上述任意一个查询后,结果会自动排除既是直接好友又是FOF的记录,得到符合需求的列表:
| Friend | FOF |
|---|---|
| A | C |
| A | Z |
这样就得到了纯好友的好友列表啦!
内容的提问来源于stack exchange,提问作者sql_learner
相关产品推荐
相关产品推荐

