MYSQL:带有 GROUP BY、LEFT JOIN 和 WHERE 子句的 COUNT 不返回零值

2023-12-23

我确信这有一个非常简单的答案,但我似乎找不到它(不知道要搜索什么!)。标准计数/按查询分组可能如下所示:

SELECT COUNT(`t2`.`name`) 
FROM `table_1` `t1` 
    LEFT JOIN `table_2` `t2` ON `t1`.`key_id` = `t2`.`key_id` 
WHERE `t1`.`another_column` = 123 

这按预期工作,如果没有找到行则返回 0。然而:

SELECT COUNT(`t2`.`name`) 
FROM `table_1` `t1` 
    LEFT JOIN `table_2` `t2` ON `t1`.`key_id` = `t2`.`key_id` 
WHERE `t1`.`another_column` = 123 
GROUP BY `t1`.`any_col` 

仅当 table_1 中至少有一行时才有效,如果有零行,则会惨遭失败并返回空结果集。我真的很希望它返回 0!有人告诉我这个吗?如果您在伦敦,可以提供啤酒作为交换;-)


它返回零行的原因是您正在对 table_1 中的值进行分组。由于 table_1 中没有值,因此没有要返回的行。换句话说,如果您在查询中从 GROUP BY 返回 t1.any_col ,如下所示:

SELECT `t1`.`any_col`, COUNT(`t2`.`name`) 
FROM `table_1` `t1` 
    LEFT JOIN `table_2` `t2` ON `t1`.`key_id` = `t2`.`key_id` 
WHERE `t1`.`another_column` = 123 
GROUP BY `t1`.`any_col` 

当没有行时,t1.any_col 会显示什么?实现您想要的效果的唯一方法是将您的结果与另一个检查 table_1 中没有行的查询合并。在此示例中,我使用 INFORMATION_SCHEMA 视图只是为了获得可以查询的内容。

SELECT COUNT(`t2`.`name`) 
FROM `table_1` `t1` 
    LEFT JOIN `table_2` `t2` ON `t1`.`key_id` = `t2`.`key_id` 
WHERE `t1`.`another_column` = 123 
GROUP BY `t1`.`any_col` 
UNION ALL
SELECT 0
FROM INFORMATION_SCHEMA.TABLES
Where Not Exists( Select 1 From `table_1` )
LIMIT 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MYSQL:带有 GROUP BY、LEFT JOIN 和 WHERE 子句的 COUNT 不返回零值 的相关文章

随机推荐