MySQL两张关联表查询统计右表NULL值行数的实现方法
核心问题排查
你的查询存在3处关键错误:
- 关联顺序颠倒:以业务表
kehadiran左连日历表calendar,业务表本身不存在的日期不会出现在关联结果中,自然无法统计到对应NULL值 - 关联条件逻辑错误:
ON c.datefield = k.keter属于字段错配,应该用日历表的日期字段关联业务表的日期字段tgl - 统计逻辑错误:
SUM(k.keter)是对字段值求和,NULL值参与求和的结果本身就是NULL,你需要统计的是keter为NULL的行数,而非字段值之和
正确统计语句
写法1:直接统计NULL行数
SELECT COUNT(*) AS null_count FROM calendar c LEFT JOIN kehadiran k ON c.datefield = k.tgl AND k.id_kar = '110101' WHERE c.datefield BETWEEN '2021-08-01' AND '2021-08-15' AND k.keter IS NULL;
注意:
id_kar的过滤条件必须写在JOIN的ON子句中,不能写在WHERE里,否则左连接会转为内连接,直接过滤掉所有没有匹配到业务数据的行。
写法2:用SUM实现统计(和你原写法逻辑更贴近)
SELECT SUM(IF(k.keter IS NULL, 1, 0)) AS null_count FROM calendar c LEFT JOIN kehadiran k ON c.datefield = k.tgl AND k.id_kar = '110101' WHERE c.datefield BETWEEN '2021-08-01' AND '2021-08-15';
上述两种写法返回的结果都是你预期的10:15天的统计范围里,有匹配数据的共5天,剩余10天对应keter为NULL。
内容的提问来源于stack exchange,提问作者iyar
相关产品推荐
相关产品推荐

