未添加右表查询条件的场景:
SELECT `o`.`id` '左表ID',`u`.`uid` '右表ID',`u`.`channel` '右表查询条件'
FROM `basic_order` `o` LEFT JOIN `basic_user` `u` ON `o`.`user_id`=`u`.`uid`
WHERE `o`.`create_time`>='1667232000' AND `o`.`create_time`<='1667318400'
ORDER BY `o`.`id` DESC;
添加了右表查询条件的场景(增加了一个 `u`.`channel` NOT IN ('umeng') 的查询条件):
SELECT `o`.`id` '左表ID',`u`.`uid` '右表ID',`u`.`channel` '右表查询条件'
FROM `basic_order` `o` LEFT JOIN `basic_user` `u` ON `o`.`user_id`=`u`.`uid`
WHERE `o`.`create_time`>='1667232000' AND `o`.`create_time`<='1667318400'
AND `u`.`channel` NOT IN ('umeng')
ORDER BY `o`.`id` DESC;
查询结果是,右表为空的左表数据也被过滤了。
解决方法(增加一个 `u`.`channel` IS NULL 的查询条件,把空的数据加回来):
SELECT `o`.`id` '左表ID',`u`.`uid` '右表ID',`u`.`channel` '右表查询条件'
FROM `basic_order` `o` LEFT JOIN `basic_user` `u` ON `o`.`user_id`=`u`.`uid`
WHERE `o`.`create_time`>='1667232000' AND `o`.`create_time`<='1667318400'
AND (`u`.`channel` NOT IN ('JTEST','umeng') OR `u`.`channel` IS NULL)
ORDER BY `o`.`id` DESC;
图一是没有添加右表查询条件的;图二是添加了右表查询条件;右表为空的左表数据加回来了。