简单的一个Demo说明下问题
表A和表B关联查询,以project_id=4为过滤条件,查询结果返回表A中的ID,name,表B中的project_id,如果表B中没有和表A匹配的记录则a.project_id返回null,于是第一次我就写出了这样的SQL
SELECT
t.id,t.name,a.project_id
FROM
micrisevice AS t
LEFT JOIN project_mirservie AS a ON a.micrservice_id = t.id
WHERE t.STATUS = 0 AND a.project_id = 4 OR a.id is NULL
问题直接出现了,left join 应该无论如何要返回左表(这里指表A)的所有记录,但是结果却不是这样的,如下
结果为ID 为2的那条数据不见了,怎么回事,一开始我以为是AND 和 OR中的条件没有加括号导致的,加了括号之后还是一样的结果,于是我就把t.STATUS=0 后面的条件删除,看看这次执行的结果是什么样的,如图
可以看到这里是left join之后的结果,看到这我明白了,刚才的条件是作用在这张临时表上了,所以导致查询条件where a.project_id= 4直接把project_id为3,5,3的过滤掉了,这和我一开始的期望是不符合的,所以应该是把条件放到 left join里去,这样才会得到我想要的临时表,如下
SELECT
t.id,
t.NAME,
a.project_id
FROM
micrisevice AS t
LEFT JOIN project_mirservie AS a ON a.micrservice_id = t.id
AND a.project_id = 4
OR a.id IS NULL
WHERE
t.STATUS = 0
这样再用where条件对临时表过滤才是期望的结果