Mysql 获取有关注者和无关注者的用户

Mysql 获取有关注者和无关注者的用户,mysql,Mysql,我有一个非常简单的table-follow,我在其中存储追随者 user | following ----------------- 1 | 2 以上表示用户1在用户2之后 我想在主页上显示所有用户,并命令他们购买拥有最多追随者的用户,然后返回没有追随者的其余用户。下面的查询可以显示用户,但我不知道如何检索没有追随者的用户。我尝试过在f.following=u.id上右键加入用户u,但这给了我奇怪的结果 此查询返回有追随者的用户2,但不返回没有追随者的用户1和3 user | follo

我有一个非常简单的table-follow,我在其中存储追随者

user | following
-----------------
1    | 2
以上表示用户1在用户2之后

我想在主页上显示所有用户,并命令他们购买拥有最多追随者的用户,然后返回没有追随者的其余用户。下面的查询可以显示用户,但我不知道如何检索没有追随者的用户。我尝试过在f.following=u.id上右键加入用户u,但这给了我奇怪的结果

此查询返回有追随者的用户2,但不返回没有追随者的用户1和3

user | following
-----------------
1    | 2
编辑:此查询还检查用户是否在返回,这就是我使用ID 1作为测试加入的原因

SELECT 
     u.id
    ,u.username
    ,u.avatar
    ,COUNT(1) AS followers
    ,ul.*
    ,fo.*
FROM  follow f
LEFT JOIN users u ON f.following=u.id
LEFT JOIN follow fo ON fo.following=u.id AND fo.user=1 
LEFT JOIN users_likes ul ON ul.likes=u.id AND ul.user=1 
GROUP BY f.following
ORDER BY COUNT(1) DESC

SQL FIDLE:

您可以通过多种方式从用户向左或向右使用外部联接到当前查询。这会让你开始。这不是一个清理解决方案,只是一个可行的dmeo方法

SELECT a.*
      ,b.*
  FROM users a 
       LEFT JOIN (
SELECT 
     u.id
    ,u.username
    ,u.avatar
    ,COUNT(1) AS followers
FROM  follow f
LEFT JOIN users u ON f.following=u.id
LEFT JOIN follow fo ON fo.following=u.id AND fo.user=1 
LEFT JOIN users_likes ul ON ul.likes=u.id AND ul.user=1 
GROUP BY f.following
) b 
ON a.id = b.id
ORDER BY followers DESC
您可以这样做:

SELECT * FROM ( SELECT u.id, u.username, u.avatar, COUNT(f.user) as followers FROM users AS u LEFT JOIN follow AS f ON u.id = f.following GROUP BY u.id ) AS subselect ORDER BY subselect.followers DESC
问题中您的查询的问题是,您只能加入下表。这意味着将包括下表中的所有行,而不管它们与另一个表的连接如何。您想要的是显示所有用户,因此表应该位于联接的外端

我还认为你试图在这里同时做太多的事情,这就是为什么你很难弄明白。你想知道谁有追随者,谁不,谁在后面,命令他们,考虑用户喜欢等等。我建议退一步,将它们分解为单独的查询,然后根据需要将它们构建成一个结果集

要获取用户和关注者数量,可以将用户表与下表进行外部联接,如下所示:

SELECT u.id, u.username, u.avatar, (IFNULL(COUNT(f.following), 0)) AS numFollowers
FROM users u
LEFT JOIN follow f ON f.following = u.id
GROUP BY u.id
ORDER BY numfollowers DESC;
IFNULL用于检查没有跟随者的情况,并且外部联接中没有链接,因此会显示null值

如果要在users_likes表中工作,则应将其作为另一个左联接添加进来。这导致的问题是,如果没有类似项,它将为所有列返回空值。例如,如果我离开这里的“加入用户”表,我会看到用户1和3为空,因为没有人“喜欢”他们。为了使结果集更容易理解,我建议您不要收集users\u likes表的所有行。也许这个问题更有意义:

SELECT u.id, u.username, u.avatar, (IFNULL(COUNT(f.following), 0)) AS numFollowers, ul.user AS likedByUser, ul.created_at
FROM users u
LEFT JOIN follow f ON f.following = u.id
LEFT JOIN users_likes ul ON ul.likes = u.id
GROUP BY u.id
ORDER BY numfollowers DESC;
至于用户是否在跟踪,我认为这会有一点变化,因为上面只显示了跟随者的数量,并没有为每个跟随者生成一行


如果你还有任何问题,请告诉我,这是一个关于上述问题的答案。我将让您来处理现在出现的空值。

不是很简单吗?谢谢,这是最接近解决方案的方法。我试图做到的是列出所有用户,如果他们没有追随者,则按追随者数量排序,然后按用户名排序,然后确定用户1是否在跟踪他们,以及用户1是否喜欢他们。希望这能把事情弄清楚@蒂姆,好的。这很容易添加一个'AND user=1'到您喜欢加入的用户中。您也可以通过再次左键加入下表来确定用户1是否跟随他们。更新。完美!谢谢你的帮助和伟大的解释:当然。在我看来,仅仅给出你可以复制和粘贴的代码,即使它有效,也不是一个好的答案。它不会帮助你前进。如果你什么也学不到,为什么要来这里是的,我进去玩了很长一段时间,离它很近。我还一直在试着用numfollowers,username来下订单,但肯定没用