我有两张表,一张用于新闻,另一张用于评论,我想获取状态已设置为已批准的评论的计数。
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()
试试下面:
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 中的布尔类型表示为 INT
0
和 1
,就像在 C 中一样。(虽然可能不能跨数据库系统移植。)
至于其他答案中提到的 COALESCE()
,许多语言 API 在获取值时会自动将 NULL
转换为 ''
。例如,使用 PHP 的 mysqli
接口,在没有 COALESCE()
的情况下运行查询是安全的。
这应该有效:
count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, NULL))
count()
只检查值是否存在。 0 相当于一个存在的值,所以多算一个,而 NULL 相当于一个不存在的值,所以不计入。
count
比 sum
更直观。
替换这一行:
count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments
有了这个:
coalesce(sum(ccc_news_comments.id = 'approved'), 0) comments
COALESCE
返回总和吗? MySQL 文档中有任何参考资料吗?
count(ccc_news_comments.id = 'approved' or null)
更简洁
COUNT
(无条件)会返回0
时,您的技巧会返回null
。当COUNT
将返回任何 但 0,但SUM
确实 返回 0 时,您的技巧将返回0
。num_relevant_parts
是带有条件的SUM
,num_total_parts
是COUNT(parts.id)
(抱歉重复评论,来不及编辑)