MySQL查询中的IF条件计数
我有两个表,一个是新闻表,另一个是评论表,我想获得状态设置为“已批准”的评论数MySQL查询中的IF条件计数,mysql,join,if-statement,count,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_n
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
但是这个查询的问题是,无论是否存在与该新闻对应的任何注释,为comments列获取的最小值都是1
任何帮助都是非常可观的。使用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
替换此行:
count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments
关于这一点:
coalesce(sum(ccc_news_comments.id = 'approved'), 0) comments
这应该起作用:
count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, NULL))
count()
仅检查该值是否存在。0相当于一个存在的值,因此它再计算一次,而NULL类似于一个不存在的值,因此不计算。更好(或更短):
这是因为MySQL中的布尔类型表示为INT
0
和1
,就像在C中一样(但可能无法跨DB系统移植)
至于其他答案中提到的
COALESCE()
,许多语言API在获取值时会自动将NULL
转换为'
。例如,使用PHP的mysqli
接口,在不使用COALESCE()
的情况下运行查询是安全的,如果使用SUM而不是COUNT?COUNT(如果(ccc_news_comments.id='approved',ccc_news_comments.id,0))???如果你使用ccc_news_comments,那么使用sum有什么意义呢?对不起,你是什么意思?布尔值变为0或1,然后求和,如果有空值,则与0@MostyMostacho,是否合并返回总和?MySQL文档中有引用吗?是的,为什么没有?文档中有很多引用:或者甚至是SUM(ccc_news_comments.id='approved')作为特定于MySQL的文件trick@mojuba不是100%相同,当COUNT
(无条件)将返回0
时,您的技巧将返回null
。当COUNT
将返回除0以外的任何值,但SUM
确实返回0时,您的技巧将返回0
@mojubanum\u related\u parts
isSUM
带条件,num\u total\u parts
isCOUNT(parts.id)
(很抱歉重复评论,编辑太晚了),这使得sql代码更具可读性。漂亮的解决方案。在搜索问题时总是能找到这个答案,这是一种魅力,可能没有任何负面影响。在这种情况下,我认为count
比sum
更直观。
SUM(ccc_news_comments.id = 'approved')