sql多表查询详解用户表角色表权限表权限加减表,根据用户id查询所有权限,连接查询

Posted dlage

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql多表查询详解用户表角色表权限表权限加减表,根据用户id查询所有权限,连接查询相关的知识,希望对你有一定的参考价值。

sql语句如下

SELECT
    p.*
FROM
    ums_admin_role_relation ar
    LEFT JOIN ums_role r ON ar.role_id = r.id
    LEFT JOIN ums_role_permission_relation rp ON r.id = rp.role_id
    LEFT JOIN ums_permission p ON rp.permission_id = p.id
WHERE
    ar.admin_id = #{adminId}
    AND p.id IS NOT NULL
    AND p.id NOT IN (
        SELECT
            p.id
        FROM
            ums_admin_permission_relation pr
            LEFT JOIN ums_permission p ON pr.permission_id = p.id
        WHERE
            pr.type = -1
            AND pr.admin_id = #{adminId}
    )
UNION
SELECT
    p.*
FROM
    ums_admin_permission_relation pr
    LEFT JOIN ums_permission p ON pr.permission_id = p.id
WHERE
    pr.type = 1
    AND pr.admin_id = #{adminId}

咋一看,代码还蛮多的。一共涉及5个表

CREATE TABLE `ums_admin_role_relation` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `admin_id` bigint DEFAULT NULL,
  `role_id` bigint DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb3 COMMENT='后台用户和角色关系表';
CREATE TABLE `ums_role` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL COMMENT '名称',
  `description` varchar(500) DEFAULT NULL COMMENT '描述',
  `admin_count` int DEFAULT NULL COMMENT '后台用户数量',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `status` int DEFAULT '1' COMMENT '启用状态:0->禁用;1->启用',
  `sort` int DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb3 COMMENT='后台用户角色表';
CREATE TABLE `ums_permission` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `pid` bigint DEFAULT NULL COMMENT '父级权限id',
  `name` varchar(100) DEFAULT NULL COMMENT '名称',
  `value` varchar(200) DEFAULT NULL COMMENT '权限值',
  `icon` varchar(500) DEFAULT NULL COMMENT '图标',
  `type` int DEFAULT NULL COMMENT '权限类型:0->目录;1->菜单;2->按钮(接口绑定权限)',
  `uri` varchar(200) DEFAULT NULL COMMENT '前端资源路径',
  `status` int DEFAULT NULL COMMENT '启用状态;0->禁用;1->启用',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `sort` int DEFAULT NULL COMMENT '排序',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb3 COMMENT='后台用户权限表';
CREATE TABLE `ums_role_permission_relation` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `role_id` bigint DEFAULT NULL,
  `permission_id` bigint DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb3 COMMENT='后台用户角色和权限关系表';
CREATE TABLE `ums_admin_permission_relation` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `admin_id` bigint DEFAULT NULL,
  `permission_id` bigint DEFAULT NULL,
  `type` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='后台用户和权限关系表(除角色中定义的权限以外的加减权限)';

sql语句里面有注释,一个用户有多个角色,每个角色有相应的权限(还有个角色权限加减表)

先看前面的语句

SELECT
    p.*
FROM
    ums_admin_role_relation ar
    LEFT JOIN ums_role r ON ar.role_id = r.id
    LEFT JOIN ums_role_permission_relation rp ON r.id = rp.role_id
    LEFT JOIN ums_permission p ON rp.permission_id = p.id

四个表连接,根据用户的id查询出用户的所有角色,根据角色查询出用户的权限。查询出权限了还不行,还有个加减权限的表,

AND p.id IS NOT NULL
    AND p.id NOT IN (
        SELECT
            p.id
        FROM
            ums_admin_permission_relation pr
            LEFT JOIN ums_permission p ON pr.permission_id = p.id
        WHERE
            pr.type = -1
            AND pr.admin_id = #{adminId}
    )

先看里面的选择语句,权限和权限加减表连接。pr.type=-1是当type等于-1时,这个权限角色要减去这个权限。

这个语句意思就清楚了,查询出用户的所有权限之后,减去一些权限。

union连接之后的语句时干什么用的。我们前面说了,ums_role_permission_relation这是一个权限加减表,刚刚我们只是减了权限。还要加上权限。

SELECT
    p.*
FROM
    ums_admin_permission_relation pr
    LEFT JOIN ums_permission p ON pr.permission_id = p.id
WHERE
    pr.type = 1
    AND pr.admin_id = #{adminId}

选择权限加减表的加上的权限和上面的权限连接即可。

以上是关于sql多表查询详解用户表角色表权限表权限加减表,根据用户id查询所有权限,连接查询的主要内容,如果未能解决你的问题,请参考以下文章

多表查询

权限管理(RBAC模型) 一条SQL查询出菜单

mybatis多表关联

mysql优化

mysql优化

SQL Server用户权限问题