SQL左连接多表查询加WHERE条件后无匹配记录未返回0值问题咨询
问题根因
你写的SQL存在两个问题:
- 左连接的过滤规则使用错误:LEFT JOIN后如果将右表(workactor)的筛选条件写在WHERE子句中,会在连接生成临时表后执行过滤。此时actors表中没有匹配到workactor记录的用户,对应所有wa开头的字段值都是NULL,
wa.age>18对NULL值的判断结果为不成立,这部分用户会被直接过滤,自然不会返回total为0的结果。 - 存在字段名笔误:你代码里写的
COUNT(wa.actor_id)和ON条件里的wa.actorid = a.actorid字段名不一致,按照你的表结构说明workactor的关联字段是actorid,这里需要修正。
解决方法
将右表的年龄筛选条件放到LEFT JOIN的ON子句中即可,这样会先过滤workactor表中符合年龄要求的记录,再和actors表做左连接,没有匹配到的用户会保留,统计结果为0。
修正后的SQL如下:
SELECT a.actorid, COUNT(wa.actorid) AS total FROM actors a LEFT JOIN workactor wa ON wa.actorid = a.actorid AND wa.age>18 GROUP BY a.actorid;
如果你需要统计的是不同工作项的数量,按照需求你应该使用COUNT(DISTINCT wa.typeofwork) 替换原来的COUNT逻辑,避免同一个工作类型重复统计的问题:
SELECT a.actorid, COUNT(DISTINCT wa.typeofwork) AS total_distinct_work FROM actors a LEFT JOIN workactor wa ON wa.actorid = a.actorid AND wa.age>18 GROUP BY a.actorid;
也可以用子查询提前过滤workactor表的有效记录,逻辑和上面的写法完全等价:
SELECT a.actorid, COUNT(wa.actorid) AS total FROM actors a LEFT JOIN (SELECT * FROM workactor WHERE age>18) wa ON wa.actorid = a.actorid GROUP BY a.actorid;
内容的提问来源于stack exchange,提问作者Sam Summers
相关产品推荐
相关产品推荐

