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

类推特网站未关注用户查询:SQL用EXCEPT还是LEFT OUTER JOIN?

关于未关注用户查询:EXCEPT vs LEFT OUTER JOIN

嗨,这个问题问得很实在——其实两种方法都能实现你的需求,但各自有不同的适用场景,我结合你的具体情况拆解一下:

先明确已知的基础查询

咱们先把你提到的“查询用户C(ID=3)已关注用户”的SQL摆出来,假设你的表结构是这样的:

  • users表:存储所有用户,主键user_id(对应你的1、2、3、4、5、6)
  • follows表:存储关注关系,字段follower_user_id(关注者ID)和followed_user_id(被关注者ID)

那查询已关注用户的SQL就是:

SELECT followed_user_id FROM follows WHERE follower_user_id = 3;

方法1:用EXCEPT实现

EXCEPT是SQL的集合差集运算,逻辑非常直观:取出所有用户ID,减去已关注的用户ID,剩下的就是未关注的。

对应你的场景,SQL写法如下:

SELECT user_id FROM users
EXCEPT
SELECT followed_user_id FROM follows WHERE follower_user_id = 3;

EXCEPT的优势:

  • 语法简洁,逻辑一目了然,完全贴合“取差集”的需求
  • 自动帮你去重(不过这里用户ID都是唯一的,所以这个特性在你的场景里作用不大)

注意点:

  • 需要你的数据库支持EXCEPT语法:主流数据库比如PostgreSQL、SQL Server、MySQL 8.0+、Oracle都是支持的,但老版本的MySQL(比如5.x)不支持,这时候就不能用这种方法了。

方法2:用LEFT OUTER JOIN实现

LEFT JOIN(通常简称LEFT OUTER JOIN)的思路是:把所有用户和用户C的关注关系左连接,然后筛选出没有匹配到关注关系的用户(也就是follows表中对应字段为NULL的记录)。

对应你的场景,SQL写法如下:

SELECT u.user_id
FROM users u
LEFT JOIN follows f 
  ON u.user_id = f.followed_user_id 
  AND f.follower_user_id = 3  -- 这里把关注者条件放在JOIN里,不是WHERE里,这点很重要!
WHERE f.followed_user_id IS NULL;

LEFT JOIN的优势:

  • 兼容性极强,几乎所有关系型数据库都支持,包括老版本的MySQL
  • 灵活性更高:如果之后你需要展示未关注用户的额外信息(比如用户名、头像、简介),直接在SELECT里加u.username, u.avatar这类字段就行,不用额外调整逻辑
  • 可以更方便地扩展查询(比如加入“共同关注数”这类推荐逻辑时,LEFT JOIN的结构更容易叠加)

总结怎么选?

  • 如果你的数据库支持EXCEPT,且只需要查询未关注用户的ID,EXCEPT写法更简洁
  • 如果需要兼容老数据库,或者要关联用户的其他信息,LEFT JOIN是更稳妥、灵活的选择

回到你的场景:要找出用户C未关注的1、2(A、B),两种方法都能得到正确结果,看你具体的数据库环境和后续需求来选就行~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:27:20