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

2019-07-19 16:46:19 浏览数 (1)

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

代码语言:javascript复制
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为其他值) 那么这个查询中会查出该用户, 违背了我们的需求; 正确的做法是:

代码语言:javascript复制
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)查询要快的多!

0 人点赞