sql left join 条件筛选的放置位置

场景:

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

发布了134 篇原创文章 · 获赞 26 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/inflaRunAs/article/details/105195477