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}
选择权限加减表的加上的权限和上面的权限连接即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~