在MySQL查询中使用IF条件进行计数


115

我有两个表,一个表用于新闻,另一个表用于评论,我想获取其状态已设置为批准的评论数。

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。

任何帮助都是非常可观的。


5
如果您使用SUM而不是COUNT怎么办?
约翰·皮克

Answers:


265

使用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 

11
甚至将SUM(ccc_news_comments.id ='approved')作为特定于MySQL的技巧
mojuba

1
@mojuba不是100%一样,您的技巧会nullCOUNT(没有条件)返回时返回0。当COUNT将已经回到什么,但 0,但SUM 不会返回0,你的绝招回报0
罗宾·坎特斯

@mojuba 情况和观点num_relevant_partsSUM有条件的,num_total_partsCOUNT(parts.id)(双评论对不起,来不及编辑)
罗宾Kanters

68

更好(还是更短):

SUM(ccc_news_comments.id = 'approved')

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

至于COALESCE()其他答案中提到的那样,许多语言API 在获取值时会自动转换NULL''。例如,使用PHP的mysqli界面,不使用即可运行查询COALESCE()


3
这使sql代码更具可读性。美丽的解决方案。
Dag Sondre Hansen

22

这应该工作:

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

count()只检查该值是否存在。0等于一个存在的值,因此它会再计数一次,而NULL就像一个不存在的值,因此不会被计数。


我认为countsum这种情况更直观。
杰弗里(Jeffery)

4

替换此行:

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,0))??? 如果您使用ccc_news_comments.id,那么使用sum的含义是什么

对不起你的意思是什么?布尔值变为0或1,然后求和,并且在某些空值合并为0的情况下
Mosty Mostacho 2012年

@MostyMostacho,COALESCE返回总和吗?MySQL文档中有任何参考吗?
Istiaque Ahmed's

是的,为什么不呢?有在文档中多次提到:dev.mysql.com/doc/refman/5.7/en/...
Mosty Mostacho
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.