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

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关注的对象再统计数量,逻辑是可行的,但存在两个可以优化的点:

  1. 冗余绕路:不需要先做集合补集,直接针对John Doe的关注列表做匹配更直观;
  2. 重复关注风险:如果存在同一用户多次关注同一对象的情况,原方案的COUNT(*)会导致统计值偏大,改用COUNT(DISTINCT)可以避免这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 07:43:16