我有一个非常简单的表 -follow我在其中存储关注者。
user | following
-----------------
1 | 3
Run Code Online (Sandbox Code Playgroud)
以上表示用户 1 关注用户 3。
问题:我想选择关注用户 3 的每个人,并且我想查看用户 3 是否关注他们。
下面的查询做我想要的,但它列出了所有用户,我只想要那些关注用户 3 的用户。我已经尝试了各种场景,但今天的逻辑只是逃避了我。这是我所能得到的最接近的。
SELECT
u.id,u.username
,u.avatar
,f.*
FROM
users u
LEFT JOIN follow f
ON f.following=u.id and f.user=3
Run Code Online (Sandbox Code Playgroud)
我将从关系开始。您需要用户 3 的所有关注者,因此从follow表开始并选择following = 3.
然后您可以加入该users表以获取这些用户的信息。这可以是内部联接,因为您需要这些记录,并且如果用户 3 没有任何关注者,则不需要返回任何内容。
然后你可以follow再次加入,看看另一个方向是否有类似的关系。我将其设为左连接,因此您可以检查是否找到该记录。
如果您只需要关注用户 3 并且也被关注的那些用户的列表,您可以简单地将此联接更改为内部联接。
SELECT
u.id,
u.username,
u.avatar,
case when b.user is null then -- No record in b if 3 didn't follow this user back.
'User is not following back'
else
'User is following back'
end as back
FROM
follow f -- IDs of followers of user 3
INNER JOIN users u -- User information of those followers
ON u.id = f.user
LEFT JOIN follow b -- Check if 3 follows them back.
ON b.user = f.following and
b.following = u.id
WHERE
f.following = 3
Run Code Online (Sandbox Code Playgroud)
如果您自己需要用户 3 的用户信息,您可以再次对users表进行内部联接f(使用不同的别名),但我会为此使用单独的查询。