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

如何编写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_idprofile_name
2Peter
4Nick

内容的提问来源于stack exchange,提问作者drossosdc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:01:05