SQL:选择多个表的计数

时间:2016-03-09 18:18:53

标签: php mysql sql

我不认为这太复杂,无法解释,但确实很复杂。

首先,我有几个关于用户评论的表格,每个部分有一个表格(论坛,文章等),如下所示:

site_users(id,username,...)[包含用户信息的表格]

site_articles_comments(id,user_id,comment,...)[where user_id = site_users.id]

site_forum_comments(id,user_id,comment,...)[site_articles_comments相同]

问题是每个新行都是一个新注释,用户可以多次注释,这意味着要添加更多行,因此需要对行数进行排序以获得某种类型的注释量排名系统。

通过这个简单的查询,我能够建立一个简单的论坛排名:

  

SELECT u.id,u.username,COUNT(r.id)AS rank from site_users AS u LEFT   JOIN site_forum_comments AS r ON u.id = r.user_id GROUP BY u.username,   u.id ORDER BY rank DESC LIMIT:l

此查询对数据库中的所有用户进行排序,其中评论最多的用户始终位于最前面。

另一方面,我需要的是拥有一个全球排名系统,它将每个部分(文章,论坛等)的评论数量相加,并相应地显示用户。

我正在玩sql来做到这一点,我想出的最后一件事就是这个巨大的问题:

  

SELECT u.id,u.username,(COUNT(a.id)+ COUNT(f.id))AS rank FROM   site_users u LEFT JOIN site_articles_comments a ON a.user_id = u.id.   LEFT JOIN site_forum_comments f ON f.user_id = u.id GROUP BY   u.username,u.id ORDER BY rank DESC LIMIT:l

然而,这会返回null。我能做些什么才能达到我想要的效果?

提前致谢,

马特乌斯

EDIT1:很抱歉缺少信息,这是关于MySQL的。

2 个答案:

答案 0 :(得分:0)

尝试SELECT u.id, MIN(u.username) AS username, (COALESCE(COUNT(DISTINCT(a.id)),0) + COALESCE(COUNT(DISTINCT(f.id)),0)) AS rank FROM site_users AS u LEFT JOIN site_articles_comments AS a ON (a.user_id = u.id) LEFT JOIN site_forum_comments AS f ON (f.user_id = u.id) GROUP BY u.id ORDER BY rank DESC LIMIT :l

答案 1 :(得分:0)

问题是使用空值的数学,并使用空值排序(检查" NULLS LAST"选项以覆盖默认排序,该排序首先以降序返回空值)。

在你的情况下,使用外连接,如果用户有大量文章评论但没有论坛评论,那么,在Oracle数学中100 + null = null。因此,要使数学工作,您需要使null = 0。这就是NVL()的用武之地(并且还具有从结果集中消除讨厌的空值的良好副作用)!

SELECT u.id, u.username, (NVL(COUNT(a.id),0) + NVL(COUNT(f.id),0)) AS rank 
FROM site_users u 
  LEFT JOIN site_articles_comments a ON a.user_id = u.id 
  LEFT JOIN site_forum_comments f ON f.user_id = u.id 
GROUP BY u.username, u.id ORDER BY rank DESC LIMIT :l

我看到你的标签中同时包含MySQL和Oracle - 以上是针对Oracle的。如果MYSQL使用COALESCE(COUNT(),0)而不是。