关于MySQL多表关联时过滤条件的位置

简单的一个Demo说明下问题

表A

表B

表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)的所有记录,但是结果却不是这样的,如下

SQL结果

结果为ID 为2的那条数据不见了,怎么回事,一开始我以为是AND 和 OR中的条件没有加括号导致的,加了括号之后还是一样的结果,于是我就把t.STATUS=0 后面的条件删除,看看这次执行的结果是什么样的,如图

SQL结果

可以看到这里是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条件对临时表过滤才是期望的结果

期望结果

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值