连接查询位置不同导致数据丢失
2021-08-30 本文已影响0人
霡霂976447044
SELECT `t1`.`id` AS `device_id`, `t1`.`device_name`, SUM(`t2`.`ep_o`) AS `epo`
FROM `collect_device` AS `t1`
LEFT OUTER JOIN `stat_hour` AS `t2` ON (((`t1`.`id` = `t2`.`collect_device_id`) AND
(`t2`.`stat_time` >= '2021-08-01 00:00:00')) AND
(`t2`.`stat_time` <= '2021-08-30 16:52:55.539177'))
WHERE ((`t1`.`calc_type` = 1) AND (`t1`.`energy_type` = 1))
GROUP BY `device_id`
on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
结论:
过滤条件放在:
on后面:先根据条件过滤筛选,再连 生成临时查询结果
where后面:是先连接然生成临时查询结果,然后再筛选
注意:如果字段存在null或者2, x !=2 也同样不会只得到null
个人理解,左连接on加的字段会查出所有数据,但是你where过滤掉了这个on查出来的。