我一直在学习 SQLite,但无法针对此查询提示找到令人满意的解决方案。我的策略包括计算关注 John Doe 关注的每个人的用户补充量。然而,它很混乱,我不禁想到必须有一个更干净、更简单的解决方案。
关注(flwer、flwee、日期)
用户(usr,名称)
其中 flwer、flwee 和 usr 都是 int 用户 ID 和密钥
查找关注 John Doe 关注的每个用户的用户 ID。 John Doe 的匹配不区分大小写。
Select flwer from
(
Select * from follows
Except
Select *
From follows f2
Where not exists (
Select flwer, flwee
From follows, users u1
Where flwee = f2.flwee and flwer = u1.usr and upper(u1.name) = upper("John Doe")
)
)
group by flwer having count(*) >= (Select Count(*) From follows, users u1 where flwer = u1.usr and upper(u1.name) = upper("John Doe"))
对此有什么指导性建议吗?在集合表示法中,我希望所有 x s.t {x 以下} 是 {John Doe 以下} 的超集
您可以考虑使用
Count()
窗口函数来获取关注者的关注者数量,以用于进行 John Doe 比较。这与您在 SQL 中采用的方向类似。
我还将一些可重用逻辑封装在 CTE 中,以保持代码整洁:
WITH JohnDoe AS (
SELECT flwee
FROM Follows
WHERE flwer = (SELECT usr FROM Users WHERE name = 'John Doe')
)
SELECT DISTINCT Users.Name
FROM (
SELECT flwer, flwee, COUNT(flwee) OVER (PARTITION BY flwer) as flwee_count
FROM Follows
WHERE flwee IN (SELECT flwee FROM JohnDoe)
) as sub
INNER JOIN Users
ON sub.flwer = Users.usr
WHERE flwee_count >= (SELECT COUNT(*) FROM JohnDoe);