You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:27:04