MySQL:选择我关注的人和关注我的人

tim*_*vin 1 mysql

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

Gol*_*rol 5

我将从关系开始。您需要用户 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(使用不同的别名),但我会为此使用单独的查询。