SQL - 计数不返回零

问题描述:

我正在运行此查询,它从一个表中选择几个字段并从其他表中返回计数。SQL - 计数不返回零

我的问题:如果我的计数器字段之一计数为零,它不会返回数字0,它只是空白 - 这是我想尝试和解决的。

SELECT mem.member_id, mem.screen_name, mem.firstname, mem.lastname, mem.country_code, 
mem.joined, rep.rep as reputation, com.cnt as comments FROM members AS mem 
LEFT OUTER JOIN (
    SELECT member_id, SUM(awarded_what) as rep 
    FROM members_reputation 
    GROUP BY member_id) rep 
    ON mem.member_id = rep.member_id 
LEFT OUTER JOIN (
    SELECT member_id, COUNT(comment_id) as cnt 
    FROM blog_comments 
    GROUP BY comment_id) com 
    ON mem.member_id = com.member_id 
GROUP BY mem.member_id 
ORDER BY mem.joined DESC 

我想什么是这样的:

Screen Name  | Comments 
-----------------|-------------------- 
marty76   | 0 
jonnyBoy12  | 0 
adamApple  | 12 

但是,我得到这样的事情,而不是!

Screen Name  | Comments 
-----------------|-------------------- 
marty76   | 
jonnyBoy12  | 
adamApple  | 12 

使用我的服务器端语言,通过用零替换空值可以很容易地解决这个问题。但是我想要直接从SQL获得零,所以我可以通过计数来排序。

任何建议将是奇妙的。

+0

不需要派生表 - 修正连接,解决问题。 – 2012-04-04 14:15:24

+0

@OMGPonies:我从这个查询中删除了5个其他的LEFT OUTER JOIN计数,所以它对我的问题更容易理解。你的意思是你说的是什么?我用其他方法测试派生表,并且迄今为止赢得了性能。 – TheCarver 2012-04-04 14:30:51

尝试IFNULL功能

SELECT mem.member_id, mem.screen_name, mem.firstname, mem.lastname, mem.country_code, 
mem.joined, rep.rep as reputation, IFNULL(com.cnt,0) as comments FROM members AS mem 
LEFT OUTER JOIN ( 
    SELECT member_id, SUM(awarded_what) as rep 
    FROM members_reputation 
    GROUP BY member_id) rep 
    ON mem.member_id = rep.member_id 
LEFT OUTER JOIN ( 
    SELECT member_id, COUNT(comment_id) as cnt 
    FROM blog_comments 
    GROUP BY comment_id) com 
    ON mem.member_id = com.member_id 
GROUP BY mem.member_id 
ORDER BY mem.joined DESC 
+0

感谢罗兰多,这是一个很大的帮助。 – TheCarver 2012-04-04 14:27:28

+0

该答案实际上帮助我处理其他查询。我现在知道我可以这样做:IFNULL(列,“N/A”),它允许我在几个地方删除一些服务器端代码。太好了! – TheCarver 2012-04-04 14:48:33

你能使用ISNULL?

ISNULL(com.cnt, 0) as comments 
+0

'ISNULL'用于MsSQL服务器 – sll 2012-04-04 14:17:20

变化:

COUNT(comment_id) 

IFNULL(COUNT(comment_id), 0) 

其他的方式可以是:

coalesce(count(comment_id),0) 

我想这应该给你你想要得到的结果它比你的查询简单得多:

SELECT mem.member_id, mem.screen_name, mem.firstname, mem.lastname, 
    mem.country_code, mem.joined, 
    SUM(awarded_what) reputation, COUNT(comment_id) comments 
FROM members mem 
LEFT JOIN members_reputation rep ON mem.member_id = rep.member_id 
LEFT JOIN blog_comments com ON mem.member_id = com.member_id 
GROUP BY mem.member_id 
ORDER BY mem.joined DESC 
+1

这不如我的派生表方法。在我真正的查询中,我有来自多个表的7个左外连接计数。对10个DB记录进行测试,我的查询运行时间为0ms,查询运行时间为1ms - 超过1m记录,这是相当大的性能提升。谢谢你:) – TheCarver 2012-04-04 14:38:59

+0

再次测试10分贝记录是根本没有测试。每张桌上至少有10,000条记录进行多次测试。 1毫秒的差异甚至可能是当时生成上下文切换的简单StackOverflow网页刷新。这不能慢,因为它正在做的工作少于您的查询 – 2012-04-04 14:49:55

+0

我不确定您的意思是1毫秒差异是一个StackOverflow网页刷新。我正在MySQL Workbench中对数据库测试两个查询,派生表赢了。它与一个StackOverflow网站刷新无关!当我说10条记录测试时,我的意思是10条记录限制在我的查询中,因为这是我在我的应用程序中打印的所有内容。它有1000多条评论。 – TheCarver 2012-04-04 15:04:20