zoukankan      html  css  js  c++  java
  • 在【用户、角色、权限】模块中如何查询不拥有某角色的用户

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

  • 相关阅读:
    CVE-20117-111882漏洞复现及利用
    如何查看QQ坦白说来自谁
    2018 巅峰极客CTF misc writeup
    屏幕截图
    Unity中设置屏幕常亮
    面向对象设计原则
    【转】Unity资源管理原理知识(干货不嫌长)
    给指定的图片增加水印
    统计一个目录下各种文件类型及个数
    JDK 开发环境配置
  • 原文地址:https://www.cnblogs.com/liulun/p/11206185.html
Copyright © 2011-2022 走看看