MySQL LEFT JOIN查询无关联评论的分组未返回0值如何修复
问题解法
错误原因
- 原始查询使用
LEFT JOIN关联user_comments后,在WHERE子句中添加了uc.deleted=0的判断:无关联评论的分组对应的uc表所有字段均为NULL,NULL=0判断不成立,会被直接过滤,相当于LEFT JOIN退化为内连接,因此仅返回有评论的分组。 - MySQL内置
ISNULL函数仅支持1个输入参数,作用是判断输入值是否为NULL并返回1/0,你传入2个参数触发参数数量错误,要实现空值替换需使用IFNULL或COALESCE函数。
正确查询语句
SELECT sg.date, sg.groupName, sg.highlights, user.display_name as displayName, COUNT(uc.groupName) as cmtcnt FROM `saved_groups` as sg LEFT JOIN `user` on user.email = sg.userName LEFT JOIN `user_comments` as uc ON sg.groupName = uc.groupName AND uc.deleted = 0 GROUP BY sg.groupName, sg.date, sg.highlights, user.display_name
修改说明
- 把
uc.deleted=0的过滤规则从WHERE子句移动到user_comments表的LEFT JOIN关联条件中,仅过滤评论表中已删除的记录,无关联评论的分组仍然会保留在结果集中,对应的uc.groupName为NULL,COUNT统计时会自动忽略NULL值,无评论的分组cmtcnt返回0,完全符合需求。 - 补充了
GROUP BY的全量非聚合字段,适配开启ONLY_FULL_GROUP_BY模式的MySQL环境,避免出现非法分组的报错。
内容的提问来源于stack exchange,提问作者cssyphus
相关产品推荐
相关产品推荐

