获得关注者和没有关注者的用户

时间:2014-11-01 20:11:14

标签: mysql

我有一个非常简单的表 - follow - 我存储了粉丝。

user | following
-----------------
1    | 2

以上意味着用户1关注用户2

我希望在主页上显示所有用户并命令他们购买拥有最多关注者的用户,然后返回其他没有关注者的用户。以下查询正在显示用户,但我无法弄清楚如何检索没有任何关注者的用户。我试过RIGHT JOIN users u ON f.following=u.id,但这给了我奇怪的结果。

此查询会返回拥有关注者的用户2,但不会返回没有关注者的用户13

编辑:此查询还会检查用户是否跟进,这就是我使用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小提琴:http://sqlfiddle.com/#!2/98f65/1

3 个答案:

答案 0 :(得分:0)

您可以通过多种方式将用户的外部联接(左或右)用于当前查询。应该让你开始的easy example。这不是一个清理解决方案,只是一种可行的方式。

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

答案 1 :(得分:0)

你可以这样做:

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

答案 2 :(得分:0)

您在问题中的查询问题是您正在加入以下表格。这意味着无论它们与另一个表的连接如何,都会包含下表中的所有行。你想要的是显示所有用户,这就是应该在连接的外端的表。

我也认为你在这里尝试做太多事情,这就是你无法搞清楚的原因。你想知道谁拥有粉丝,谁不跟踪,谁跟进,订购,考虑users_likes等等。我建议退一步,将它们分解为单个查询,然后根据需要将它们构建到一个结果集中。

要获取用户和关注者数量,您可以使用以下表格对users表进行外部加入:

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用于在没有关注者的情况下检查案例,并且在外连接中没有链接,因此显示空值。

如果您想在users_likes表中工作,则应将其作为另一个左连接添加。这导致的问题是,如果没有喜欢,它将为所有列返回空值。 (例如,如果我在这里加入users_likes表,我将看到用户1和3的null,因为没有人'喜欢'他们。)为了使结果集更容易理解,我建议你不要收集所有的行users_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;

至于用户是否跟进,我认为这会有所改变,因为上面只显示了关注者的数量,并且没有为每个关注者产生一行。

如果您还有其他问题,请告诉我,以上是SQL Fiddle。我将把它留给你处理现在发生的空值。