ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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,无论是否存在与该新闻对应的评论。

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

如果您使用 SUM 而不是 COUNT 怎么办?

E
ElChiniNet

使用 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_comments.id = 'approved') 作为 MySQL 特定的技巧
@mojuba 不是 100% 相同,当 COUNT(无条件)会返回 0 时,您的技巧会返回 null。当 COUNT 将返回任何 0,但 SUM 确实 返回 0 时,您的技巧将返回 0
@mojuba case and pointnum_relevant_parts 是带有条件的 SUMnum_total_partsCOUNT(parts.id)(抱歉重复评论,来不及编辑)
p
potashin

更好(或更短):

SUM(ccc_news_comments.id = 'approved')

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

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


这使得 sql 代码更具可读性。美丽的解决方案。
在搜索问题时总是找到这个答案,作为一种魅力,可能没有缺点
A
Alexis Pigeon

这应该有效:

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

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


在这种情况下,我认为 countsum 更直观。
M
Mosty Mostacho

替换这一行:

count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments

有了这个:

coalesce(sum(ccc_news_comments.id = 'approved'), 0) comments

计数(如果(ccc_news_comments.id = '已批准',ccc_news_comments.id,0))???如果您使用 ccc_news_comments.id,那么使用 sum 的意义是什么
抱歉,你的意思是什么?布尔值变为0或1,然后求和,如果有一些空值与0合并
@MostyMostacho,COALESCE 返回总和吗? MySQL 文档中有任何参考资料吗?
是的,为什么不呢?文档中有很多参考资料:dev.mysql.com/doc/refman/5.7/en/…
Z
Zhang Peng
count(ccc_news_comments.id = 'approved' or null)

更简洁


虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review