在【用户、角色、权限】模块中如何查询不拥有某角色的用户

用户与角色是多对多的关系,
一个角色可以被赋予给多个用户,一个用户也可以拥有多个角色;
查询不拥有某角色的所有用户,
如果用leftjoin查询,会造成重复的记录:
举例错误的做法:

select * from `system_user` 
left join `system_user_role` on `system_user`.`id` = `system_user_role`.`user_id` 
where not `system_user_role`.`role_id` = '6ce3c030-a2e0-11e9-8bdc-495ad65d4804' 
or `system_user_role`.`role_id` is null 
order by `system_user_role`.`create_time` desc limit 38;

这个查询虽然用到了(or `system_user_role`.`role_id` is null )防止结果缺失,但会有重复的记录出现!
如果一个用户,
被赋予了角色(id为6ce3c030-a2e0-11e9-8bdc-495ad65d4804)
该用户又被赋予了另一个角色(id为其他值)
那么这个查询中会查出该用户,
违背了我们的需求;

正确的做法是:

select * from `system_user` 
where not exists (select 1 from `system_user_role` where system_user.id = system_user_role.user_id and system_user_role.role_id = '6ce3c030-a2e0-11e9-8bdc-495ad65d4804' );

这个做法用到了not exists子查询
注意:这样的子查询是可以设置与父查询的关联条件的(where system_user.id = system_user_role.user_id)
这种查询比(not in)查询要快的多!
 

posted @ 2019-07-18 11:31  liulun  阅读(722)  评论(0编辑  收藏  举报