前几天公司要求将系统菜单树以及菜单对应的角色关系列出来做调整,所以写了如下SQL供参考
select TT.T1 一级菜单, TT.T2 二级菜单, TT.T3 三级菜单, TT.T4 四级菜单, group_concat(rel.role_code) 菜单角色
from (select m1.menu_name T1, m2.menu_name T2, m3.menu_name T3, m4.menu_name T4,
(CASE
WHEN m4.parent_code IS NULL
THEN CASE
WHEN m3.parent_code IS NULL
THEN m2.parent_code -- 从最后一级菜单往上匹配没有parent_code的菜单(这里到二级菜单结束)
ELSE m3.parent_code
END
ELSE m4.parent_code
END) code
from menu_test m1
left join menu_test m2 on m1.menu_code = m2.parent_code
left join menu_test m3 on m2.menu_code = m3.parent_code
left join menu_test m4 on m3.menu_code = m4.parent_code -- 这里有几级菜单就关联几个
where m1.level = '1' ) TT , -- 从一级菜单开始往下查询
role_meun_rel rel
where TT.code = rel.menu_code
group by TT.T1, TT.T2, TT.T3, TT.T4
查询效果如下:
一级菜单 | 二级菜单 | 三级菜单 | 四级菜单 | 菜单角色 |
一级菜单 | 二级菜单(1) | XX10,XX20,XX30,XX99 | ||
一级菜单 | 二级菜单(2) | 三级菜单(2)(1) | XX20,XX99 | |
一级菜单 | 二级菜单(3) | 三级菜单(3)(1) | 四级菜单(3)(1)(1) | XX30,XX99 |
以上查询涉及到菜单表、角色与菜单关系表 表结构如下(随便建的表仅供参考):
CREATE TABLE menu_test (
`menu_code` varchar(10) CHARACTER NOT NULL COMMENT '菜单编码',
`level` varchar(2) CHARACTER DEFAULT NULL COMMENT '菜单级别',
`parent_code` varchar(10) CHARACTER DEFAULT NULL COMMENT '父菜单编码',
`menu_name` varchar(20) CHARACTER DEFAULT NULL COMMENT '菜单名称',
PRIMARY KEY (`menu_code`)
) COMMENT='菜单表';
CREATE TABLE `role_meun_rel` (
`role_code` varchar(20) CHARACTER DEFAULT NULL COMMENT '角色编码',
`menu_code` varchar(20) DEFAULT NULL COMMENT '菜单编码',
UNIQUE KEY `role_menu_index` (`role_code`,`menu_code`)
) COMMENT='角色与菜单关系表';