做项目的时候,遇到的大坑!所以在此记录一下。
大概的sql如下:
select * from `goods` g LEFT JOIN `goods_rel` grl on g.id = grl.case_id LEFT JOIN `user` ur on grl.user_id = ur.id where g.id = 100 and ur.status=0;
这一段sql的意思大概就是:三张表关联,然后同时user表的status=0,这张表搜出来后,数据显示为空,需要注意g.id=100的这个goods,他的扩展信息表goods_rel里的user_id是null;
select * from `goods` g LEFT JOIN `goods_rel` grl on g.id = grl.case_id LEFT JOIN `user` ur on grl.user_id = ur.id and ur.status=0 where g.id = 100;
换了一段sql后,发现数据显示出来了:
1.在on后面加条件仅适合用于left join (right join未测,inner join与where类似)
2.不考虑where条件下,left join 会把左表所有数据查询出来,on及其后面的条件仅仅会影响右表的数据(符合就显示,不符合全部为null,on后面紧跟着的是关联语句,后面的and条件只能管到右表!)
3.where后面加条件与左连接本身无关,影响的是连接产生后的数据(上面的例子很好解释,ur.status=0影响的是连接之后产生的数据,因为id=100的这个goods没有userId,所以也就是不满足ur.status=0,被过滤了)
4.所以左连接关注的是左边的主表数据,不应该把on后面的从表中的条件加到where后,这样会影响原有主表中的数据(这里的ur.status=0应该放在on后面,因为这样的话只会影响到右表数据,到那时如果放在where后面相当于影响了三表关联后的中间表!!导致显示为空)
原文地址:https://www.cnblogs.com/Booker808-java/p/12207303.html
时间: 2024-11-13 08:15:25