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查询所有权限,连接查询的主要内容,如果未能解决你的问题,请参考以下文章