2014-11-01 86 views
0

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

+0

是不是那么简单,如[*见示例*](http://sqlfiddle.com/#!2/3421e/2)? – 2014-11-01 20:46:49

回答

0

在这个问题您查询的问题是,你是左加入到后续表。这意味着后续表格中的所有行都包含在内,而与其他表格的连接无关。你想要的是显示所有用户,所以这就是应该在连接外端的表。

我也认为你在这里试图做太多事情,这就是为什么你很难找出答案。你想知道谁有追随者,谁不追随,谁追随他们,订购他们,考虑users_likes等等。我建议退后一步,将其分解为单个查询,然后根据需要将它们构建到一个结果集中。

要得到用户和追随者的数量,可以外连接用户表与后续的表是这样的:

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。我将留给你处理现在发生的空值。

+0

谢谢,这是解决方案中最接近的一个。我试图完成的是列出所有用户和“ORDER BY”多个追随者(如果他们没有任何追随者,然后按用户名命令),那么确定用户1是否追随他们,并且如果用户1喜欢他们。希望清除它。 :) – timgavin 2014-11-01 23:25:13

+0

@Tim,好吧。这很容易在users_likes加入中添加'AND user = 1'。你也可以做同样的事情,找出用户1是否通过再次加入关注表来跟踪他们。更新了[SQL小提琴](http://sqlfiddle.com/#!2/98f65/60)。 – AdamMc331 2014-11-01 23:33:15

+0

完美!谢谢你的帮助和很好的解释:) – timgavin 2014-11-01 23:43:51

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 
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 

相关问题