在mysql查询中使用if条件计数

时间:2012-03-21 05:11:41

标签: mysql join if-statement count

我有两个表,一个是新闻,另一个是评论,我想得到其状态已经批准的评论的计数。

SELECT ccc_news . * , 
count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments
FROM ccc_news
LEFT JOIN ccc_news_comments ON ccc_news_comments.news_id = ccc_news.news_id
WHERE `ccc_news`.`category` = 'news_layer2'
AND `ccc_news`.`status` = 'Active'
GROUP BY ccc_news.news_id
ORDER BY ccc_news.set_order ASC
LIMIT 20 

但是这个查询的问题是,对于该列提取的最小值是1是否存在与该消息相对应的任何评论。

任何帮助都会非常明显。

4 个答案:

答案 0 :(得分:229)

使用sum()代替count()

尝试以下:

SELECT ccc_news . * , 
SUM(if(ccc_news_comments.id = 'approved', 1, 0)) AS comments
FROM ccc_news
LEFT JOIN ccc_news_comments ON ccc_news_comments.news_id = ccc_news.news_id
WHERE `ccc_news`.`category` = 'news_layer2'
AND `ccc_news`.`status` = 'Active'
GROUP BY ccc_news.news_id
ORDER BY ccc_news.set_order ASC
LIMIT 20 

答案 1 :(得分:54)

更好(或者更短):

SUM(ccc_news_comments.id = 'approved')

这是有效的,因为MySQL中的布尔类型表示为INT 01,就像在C中一样。(虽然可能无法跨数据库系统移植。)

对于其他答案中提到的COALESCE(),许多语言API在获取值时会自动将NULL转换为''。例如,使用PHP的mysqli接口,在没有COALESCE()的情况下运行查询是安全的。

答案 2 :(得分:18)

这应该有效:

count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, NULL))

count()仅检查值是否存在。 0相当于一个存在的值,所以它再计数一次,而NULL就像一个不存在的值,因此不计算。

答案 3 :(得分:1)

替换此行:

count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments

有了这个:

coalesce(sum(ccc_news_comments.id = 'approved'), 0) comments