我有一个非常简单的表 - follow
- 我存储了粉丝。
user | following
-----------------
1 | 3
以上意味着用户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
答案 0 :(得分:3)
我会从关系开始。您希望用户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
如果您需要用户3自己的用户信息,您可以第二次内联users
表f
(使用不同的别名),但我会使用单独的查询。