场景:
admin_user表 left join admin_role表,要求:不管admin_role表数据是否存在,admin_user表数据都展示
问题:
表:admin_user
admin_role
sql
SELECT
au.id,
au.name as userName,
au.role_id as roleId,
ar.name as roleName
FROM
`admin_user` au
LEFT JOIN admin_role ar ON au.role_id = ar.id
WHERE
ar.account_status = 1
结果:
这显然是不符合要求的(不管右表是否有匹配数据,左表数据都展示)
原因:
在where之前的数据 先联查,合并成了一个集合,后对此集合进行account_status判断,此时右表数据为空,而空不等于1,所以数据都被过滤掉了。
解决:
SELECT
au.id,
au.name as userName,
au.role_id as roleId,
ar.name as roleName
FROM
`admin_user` au
LEFT JOIN admin_role ar ON au.role_id = ar.id and ar.account_status = 1
在两表查询之前,先过滤数据,过滤的仅仅是B表,所谓的先过滤B表,再联查A和B