类推特网站未关注用户查询: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
相关产品推荐
相关产品推荐

