MySQL用RIGHT JOIN加日期筛选时如何让无匹配班次统计值显示为0
问题根因
日期条件写在WHERE子句时,筛选会作用于JOIN后的全量结果集:当日无检查记录的班次关联出来的checkups字段全为NULL,date(checkups.created_at) = '2021-09-13'判断不通过,直接被过滤。
最优解决方案
把日期筛选逻辑移到RIGHT JOIN的ON关联条件中,仅关联符合日期要求的检查记录,不会过滤无匹配的班次:
SELECT count(checkups.checkups_id) as checkup_count, shifts.description, shifts.shifts_id FROM checkups RIGHT JOIN shifts ON shifts.shifts_id = checkups.shifts_id AND date(checkups.created_at) = '2021-09-13' GROUP BY shifts.shifts_id, shifts.description
注:你原本使用
count(checkups_id)的逻辑是正确的,该函数会自动忽略NULL值,无检查记录的班次统计结果会直接返回0,无需额外调整。GROUP BY补充shifts.description是为了兼容严格SQL模式的数据库要求,避免语法报错。
备选写法(不推荐)
如果一定要把条件写在WHERE中,可补充NULL值判断逻辑,不过效率比上面的写法低:
SELECT count(checkups.checkups_id) as checkup_count, shifts.description, shifts.shifts_id FROM checkups RIGHT JOIN shifts ON shifts.shifts_id=checkups.shifts_id WHERE date(checkups.created_at) = '2021-09-13' OR checkups.checkups_id IS NULL GROUP BY shifts.shifts_id, shifts.description
内容的提问来源于stack exchange,提问作者DenjanD
相关产品推荐
相关产品推荐

