SQLite技术问询:查找关注John Doe所有关注对象的用户ID
针对SQLite关注关系查询的简洁实现方案
需求回顾
查找所有关注了John Doe所关注的每一位用户的用户ID,对John Doe的匹配需不区分大小写。
更简洁的实现方式
方法1:基于计数匹配(直观易读)
WITH john_follows AS ( -- 先获取John Doe关注的所有用户ID SELECT f.flwee FROM Follows f JOIN Users u ON f.flwer = u.usr WHERE UPPER(u.name) = UPPER('John Doe') ) -- 统计每个用户关注John Doe关注列表中对象的数量,匹配总数即为符合条件的用户 SELECT f.flwer FROM Follows f JOIN john_follows jf ON f.flwee = jf.flwee GROUP BY f.flwer HAVING COUNT(DISTINCT f.flwee) = (SELECT COUNT(*) FROM john_follows);
方法2:基于NOT EXISTS(直接映射集合超集逻辑)
这种写法完全对应你描述的「x的关注对象集合是John Doe关注集合的超集」逻辑:
SELECT DISTINCT f.flwer FROM Follows f WHERE NOT EXISTS ( -- 不存在John Doe关注的用户,是当前用户未关注的 SELECT 1 FROM Follows jf JOIN Users u ON jf.flwer = u.usr WHERE UPPER(u.name) = UPPER('John Doe') AND NOT EXISTS ( SELECT 1 FROM Follows f2 WHERE f2.flwer = f.flwer AND f2.flwee = jf.flwee ) );
原方案的优化点说明
你的原方案通过Except排除非John Doe关注的对象再统计数量,逻辑是可行的,但存在两个可以优化的点:
- 冗余绕路:不需要先做集合补集,直接针对John Doe的关注列表做匹配更直观;
- 重复关注风险:如果存在同一用户多次关注同一对象的情况,原方案的
COUNT(*)会导致统计值偏大,改用COUNT(DISTINCT)可以避免这个问题。
内容的提问来源于stack exchange,提问作者Dakota Kryzanowski
相关产品推荐
相关产品推荐

