关注我在 SQL 中关注的用户
Get following of users whom I follow in SQL
我有两个 table 叫做 users
和 fans
。
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
运算符执行此操作,但我不确定它是否会随着更多条目的扩展而很好地扩展。任何帮助将不胜感激。
如果我没理解错的话,你可以尝试加入users
和fans
来找出被关注的用户然后加入
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
您必须加入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。
我有两个 table 叫做 users
和 fans
。
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
运算符执行此操作,但我不确定它是否会随着更多条目的扩展而很好地扩展。任何帮助将不胜感激。
如果我没理解错的话,你可以尝试加入users
和fans
来找出被关注的用户然后加入
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
您必须加入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。