公司动态
关于MySQL多表关联时过滤条件的位置
简单的一个Demo说明下问题表A和表B关联查询以project_id4为过滤条件查询结果返回表A中的IDname表B中的project_id,如果表B中没有和表A匹配的记录则a.project_id返回null于是第一次我就写出了这样的SQLSELECT 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.STATUS0 后面的条件删除看看这次执行的结果是什么样的如图可以看到这里是left join之后的结果看到这我明白了刚才的条件是作用在这张临时表上了所以导致查询条件where a.project_id 4直接把project_id为353的过滤掉了这和我一开始的期望是不符合的所以应该是把条件放到 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条件对临时表过滤才是期望的结果