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


    用户与角色是多对多的关系,
    一个角色可以被赋予给多个用户,一个用户也可以拥有多个角色;
    查询不拥有某角色的所有用户,
    如果用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)查询要快的多!
     

  • 相关阅读:
    2032 杨辉三角
    2023 求平均成绩
    幸运数
    扑克牌大小
    single-number
    合唱队
    Problem A: 【字符串】最长回文子串
    Problem A: 最大连续子序列
    数串
    02CSS3基本语法05
  • 原文地址:https://www.cnblogs.com/liulun/p/11206185.html
Copyright © 2020-2023  润新知