如何编写SQL查询获取与friend_id为1的用户无好友关系的用户?
查询与指定用户无好友关系的SQL解决方案
首先明确需求:从friends表中获取与friend_id=1无好友关系的用户(即Peter和Nick,对应ID2和4)。
问题分析
你之前使用friend_id1 !=1的条件无法得到正确结果,原因是这个条件仅过滤了myfriends表中发起好友关系的不是1的记录,但这些记录包含了其他用户的好友关系,并没有排除所有与1存在好友关系的用户(比如用户3和1是好友,myfriends中存在3→1的记录,friend_id1 !=1不会排除该记录,导致用户3会被错误包含在结果里)。
可行的SQL查询方法
方法1:使用NOT IN子查询
先找出所有与friend_id=1存在好友关系的用户ID,再从friends表中排除这些ID,同时排除用户自己:
SELECT friend_id, profile_name FROM friends WHERE friend_id != 1 AND friend_id NOT IN ( SELECT friend_id2 FROM myfriends WHERE friend_id1 = 1 UNION SELECT friend_id1 FROM myfriends WHERE friend_id2 = 1 );
子查询用UNION合并两种好友关系场景:1作为发起者的好友(friend_id2)、1作为被添加者的好友(friend_id1),确保所有与1有好友关系的ID都被排除。
方法2:使用LEFT JOIN + IS NULL
通过左连接关联用户表和好友关系表,筛选出未匹配到好友关系的用户:
SELECT f.friend_id, f.profile_name FROM friends f LEFT JOIN myfriends mf ON (mf.friend_id1 = f.friend_id AND mf.friend_id2 = 1) OR (mf.friend_id2 = f.friend_id AND mf.friend_id1 = 1) WHERE f.friend_id != 1 AND mf.friend_id1 IS NULL;
连接条件覆盖了用户与1互为好友的两种记录形式,LEFT JOIN保留所有用户后,通过mf.friend_id1 IS NULL筛选出无匹配好友关系的用户,即和1无好友关系的人。
方法3:使用NOT EXISTS
通过NOT EXISTS判断用户与1之间不存在任何好友关系记录:
SELECT friend_id, profile_name FROM friends f WHERE friend_id != 1 AND NOT EXISTS ( SELECT 1 FROM myfriends mf WHERE (mf.friend_id1 = f.friend_id AND mf.friend_id2 = 1) OR (mf.friend_id2 = f.friend_id AND mf.friend_id1 = 1) );
逻辑直观:对每个排除自身的用户,若不存在任何与1相关的好友关系记录,就返回该用户信息。
验证结果
以上三种方法均会返回正确结果:
| friend_id | profile_name |
|---|---|
| 2 | Peter |
| 4 | Nick |
内容的提问来源于stack exchange,提问作者drossosdc
相关产品推荐
相关产品推荐

