MySQL:选择我关注的人,并关注我

时间:2014-09-20 22:41:03

标签: mysql

我有一个非常简单的表 - 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

1 个答案:

答案 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自己的用户信息,您可以第二次内联usersf(使用不同的别名),但我会使用单独的查询。