关注我在 SQL 中关注的用户

Get following of users whom I follow in SQL

我有两个 table 叫做 usersfans
users table 看起来像这样:

id | name
---------
1  | John
2  | Mark
3  | Bill
4  | Steve
5  | Jeff

这是 fans table:

fan | user
1   | 2
1   | 5
2   | 3
2   | 4
2   | 5

“粉丝”是正在关注的用户,“用户”是被关注的用户。现在,如果我们将 John (id 1) 作为当前用户,并且假设 John 正在关注 Mark (id 2),我们如何获得 John 正在关注的每个人的关注,而不是 John 已经关注的人(在在这种情况下,John 正在关注 Mark。Mark 正在关注用户 3、4 和 5,但应该只返回 3 和 4,因为 John 已经在关注用户 5。)?我尝试使用 IN 运算符执行此操作,但我不确定它是否会随着更多条目的扩展而很好地扩展。任何帮助将不胜感激。

如果我没理解错的话,你可以尝试加入usersfans来找出被关注的用户然后加入

SELECT *
FROM users u1
WHERE EXISTS (
    SELECT 1
    FROM users uu
    INNER JOIN fans f
    ON uu.id = f.fan 
    WHERE uu.id = 1 AND f.user = u1.id
)

或使用 self-join 用户两次

SELECT u1.*
FROM users u1
INNER JOIN users uu
INNER JOIN fans f
ON uu.id = f.fan AND f.user = u1.id
WHERE uu.id = 1

sqlfiddle

您必须加入fans的多个副本:

SELECT f1.user
FROM fans f1 
INNER JOIN fans f2 ON f2.user = f1.fan 
LEFT JOIN fans f3 ON f3.fan = f2.fan AND f3.user = f1.user 
WHERE f2.fan = ? AND f3.fan IS NULL;

如果您还需要用户的姓名:

SELECT u.*
FROM users u
INNER JOIN fans f1 ON f1.user = u.ID
INNER JOIN fans f2 ON f2.user = f1.fan 
LEFT JOIN fans f3 ON f3.fan = f2.fan AND f3.user = f1.user 
WHERE f2.fan = ? AND f3.fan IS NULL;

? 更改为您想要的用户 ID。

参见demo