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获得零,所以我可以通过计数来排序。
任何建议将是奇妙的。
尝试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
变化:
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
这不如我的派生表方法。在我真正的查询中,我有来自多个表的7个左外连接计数。对10个DB记录进行测试,我的查询运行时间为0ms,查询运行时间为1ms - 超过1m记录,这是相当大的性能提升。谢谢你:) – TheCarver 2012-04-04 14:38:59
再次测试10分贝记录是根本没有测试。每张桌上至少有10,000条记录进行多次测试。 1毫秒的差异甚至可能是当时生成上下文切换的简单StackOverflow网页刷新。这不能慢,因为它正在做的工作少于您的查询 – 2012-04-04 14:49:55
我不确定您的意思是1毫秒差异是一个StackOverflow网页刷新。我正在MySQL Workbench中对数据库测试两个查询,派生表赢了。它与一个StackOverflow网站刷新无关!当我说10条记录测试时,我的意思是10条记录限制在我的查询中,因为这是我在我的应用程序中打印的所有内容。它有1000多条评论。 – TheCarver 2012-04-04 15:04:20
不需要派生表 - 修正连接,解决问题。 – 2012-04-04 14:15:24
@OMGPonies:我从这个查询中删除了5个其他的LEFT OUTER JOIN计数,所以它对我的问题更容易理解。你的意思是你说的是什么?我用其他方法测试派生表,并且迄今为止赢得了性能。 – TheCarver 2012-04-04 14:30:51