我有两个表,一个是新闻,另一个是评论,我想得到其状态已经批准的评论的计数。
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是否存在与该消息相对应的任何评论。
任何帮助都会非常明显。
答案 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
0
和1
,就像在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