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
@mojuba
num\u related\u parts
is
SUM
带条件,
num\u total\u parts
is
COUNT(parts.id)
(很抱歉重复评论,编辑太晚了),这使得sql代码更具可读性。漂亮的解决方案。在搜索问题时总是能找到这个答案,这是一种魅力,可能没有任何负面影响。在这种情况下,我认为
count
sum
更直观。
SUM(ccc_news_comments.id = 'approved')