我不认为这太复杂,无法解释,但确实很复杂。
首先,我有几个关于用户评论的表格,每个部分有一个表格(论坛,文章等),如下所示:
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的。
答案 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)而不是。