left join 踩坑

没理解好left join的定义所以出了一下的bug
left join的定义:关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

注意:不管on后面的条件是什么(即使有对左表/右表的筛选),在where之前 所有左表的数据都会被拿出来!
那么on后左表/右表的筛选有什么用呢 ?答:不通过on后面筛选条件的那一条数据 右表部分的所有字段就都是null 但还是会出现在结果里!

场景一:
有3张表:角色表 角色人员关系表 人员表
本意:根据角色获取相应人员信息

1.错误的源码

 SELECT DISTINCT u.Id PlatUserId,u.UserName FROM user_rolebind ur 
left JOIN role r ON ur.RoleId=r.Id  AND ur.Deleted=0  AND r.Deleted=0 AND r.RoleCode IN (1002,1003,1004)
left  JOIN user u ON ur.UserId=u.Id AND u.Deleted=0 

查询结果:把所有的角色都查出来了
在这里插入图片描述
2.正确的

 SELECT DISTINCT u.Id PlatUserId,u.UserName FROM user_rolebind ur 
JOIN role r ON ur.RoleId=r.Id  AND ur.Deleted=0  AND r.Deleted=0 AND r.RoleCode IN (1002,1003,1004)
JOIN user u ON ur.UserId=u.Id AND u.Deleted=0 

查询结果:根据角色过滤了
在这里插入图片描述

场景二:
有2张表:人员表 照片表
本意:人员表的部分数据没有存对应照片的id,但是要显示所有人及其照片的列表

1.错误的源码

SELECT *
                            FROM user u
                            LEFT JOIN picture p ON u.Id = p.UserId 
                            WHERE p.Deleted=0 AND u.Deleted=0

查询结果:只查出有照片关系的人员(共38条数据)

2.正确的

SELECT *
                            FROM user u
                            LEFT JOIN picture p ON u.Id = p.UserId  AND p.Deleted=0 AND u.Deleted=0

查询结果:查出了所有人员(共250条数据)

扫描二维码关注公众号,回复: 6076088 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_34702563/article/details/89707573