MySQL LEFT JOIN查询COUNT()统计无匹配返回1的问题如何修复?
问题原因
你遇到的无评论分组返回1的问题是COUNT(*)的特性导致的:
COUNT(*)会统计所有符合条件的行数,哪怕关联的user_comments表没有匹配记录,LEFT JOIN后依然会生成1行数据(只是user_comments的所有字段值为NULL),所以无评论的分组也会返回1。- 你之前用
COALESCE不生效是因为COUNT(*)的返回值本身是数值1,不是NULL,所以替换无效。
修复方案
把统计逻辑改成统计user_comments表的非空字段即可,COUNT(字段)会自动忽略NULL值,没有匹配评论时就会返回0,示例修改如下:
SELECT sg.date, sg.groupName, sg.highlights, user.display_name as displayName, COUNT(uc.groupName) as cmtcnt -- 这里换成uc表的任意非空字段均可,用uc.id等主键字段更稳妥 FROM `saved_groups` as sg LEFT JOIN `user` on user.email = sg.userName LEFT JOIN `user_comments` as uc on sg.groupName = uc.groupName GROUP BY sg.groupName, sg.date, sg.highlights, user.display_name -- 建议补全GROUP BY字段,避免开启ONLY_FULL_GROUP_BY时执行报错
额外说明
如果你的业务逻辑中同一个groupName对应的sg.date、sg.highlights、user.display_name肯定是唯一值,也可以用MySQL的ANY_VALUE()函数包裹非聚合字段,兼容SQL模式限制。
内容的提问来源于stack exchange,提问作者cssyphus
相关产品推荐
相关产品推荐

