MySQL中GROUP BY搭配COUNT统计时返回1而非0的解决方法
问题修复方案
问题原因
你当前使用COUNT(a.id)统计的是左连接后subjects表的id字段,而左连接的特性是即使photos表中没有匹配的记录,subjects的字段依然会保留非空值,因此COUNT(a.id)始终会统计到至少1条记录,无法得到0的结果。
修正后的SQL语句
将统计字段改为photos表中的非空字段(比如b.subject_id或b.id),因为当没有匹配的照片记录时,这些字段会是NULL,而COUNT()函数会忽略NULL值:
SELECT a.id, a.name, COUNT(b.subject_id) AS `refcount` FROM `subjects` a LEFT JOIN `photos` b ON a.id = b.subject_id GROUP BY a.id ORDER BY a.name;
另外你原SQL存在两处语法错误,已一并修正:
- 去掉了
SELECT行末尾多余的逗号 - 移除了
ORDER BY语句末尾错误的引号
其他可选写法
如果需要更明确的逻辑,也可以用条件求和的方式实现:
SELECT a.id, a.name, SUM(CASE WHEN b.id IS NOT NULL THEN 1 ELSE 0 END) AS `refcount` FROM `subjects` a LEFT JOIN `photos` b ON a.id = b.subject_id GROUP BY a.id ORDER BY a.name;
内容的提问来源于stack exchange,提问作者Kabilan S
相关产品推荐
相关产品推荐

