连接查询位置不同导致数据丢失

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后面:是先连接然生成临时查询结果,然后再筛选

个人理解,左连接on加的字段会查出所有数据,但是你where过滤掉了这个on查出来的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章