【问题标题】:Count with IF condition in MySQL query在 MySQL 查询中使用 IF 条件计数
【发布时间】:2012-04-05 15:16:27
【问题描述】:

我有两张表,一张是新闻,另一张是cmets,我想获取状态已设置为已批准的cmets的计数。

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 

但是这个查询的问题是,无论是否存在与该新闻对应的任何评论,为 cmets 列获取的最小值都是 1。

任何帮助都将不胜感激。

【问题讨论】:

  • 如果使用 SUM 而不是 COUNT 会怎样?

标签: mysql join if-statement count


【解决方案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 

【讨论】:

  • 甚至 SUM(ccc_news_cmets.id = 'approved') 作为 MySQL 特有的技巧
  • @mojuba 不是 100% 相同,当 COUNT(无条件)返回 0 时,您的技巧会返回 null。当COUNT 将返回任何 0,但SUM 确实 返回0时,您的技巧将返回0
  • @mojuba case and pointnum_relevant_partsSUM 有条件,num_total_partsCOUNT(parts.id)(抱歉重复评论,来不及编辑)
【解决方案2】:

更好(或者更短):

SUM(ccc_news_comments.id = 'approved')

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

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

【讨论】:

  • 这使得 sql 代码的可读性显着提高。漂亮的解决方案。
  • 在搜索问题时总是找到这个答案,作为一种魅力,可能没有缺点
【解决方案3】:

这应该可行:

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

count() 只检查值是否存在。 0等价于一个存在的值,所以多算一个,而NULL相当于一个不存在的值,所以不计入。

【讨论】:

  • 我认为在这种情况下countsum 更直观。
【解决方案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_cmets.id = 'approved', ccc_news_cmets.id, 0)) ???如果你使用 ccc_news_cmets.id ,使用 sum 意味着什么
  • 对不起,你是什么意思?布尔值变为0或1,然后求和,万一有空值与0合并
  • @MostyMostacho,COALESCE 是否返回总和? MySQL 文档中有任何参考吗?
  • 是的,为什么不呢?文档中有很多参考资料:dev.mysql.com/doc/refman/5.7/en/…
【解决方案5】:
count(ccc_news_comments.id = 'approved' or null)

更简洁

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
猜你喜欢
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 2013-04-19
  • 1970-01-01
相关资源
最近更新 更多