没理解好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条数据)