mysql查询指定节点下的所有子节点

一、菜单结构

84c79378-b831-4666-93f3-f506c591d1b3

 目标:查询出第三方单位下的所有节点

数据库表结构:

CREATE TABLE `sys_menu` (
`ID` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`MENU_NAME` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '菜单名称',
`MENU_F` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '菜单上级编号',
PRIMARY KEY (`ID`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC COMMENT='菜单表';

 

父节点数据:

INSERT INTO  `sys_menu`(`ID`, `MENU_NAME`, `MENU_F`) VALUES ('d6334a2be86111ecab01a97e6b14275e', '第三方单位', 'a0');

image

字节点数据

image

 

INSERT INTO  `sys_menu`(`ID`, `MENU_NAME`, `MENU_F`) VALUES ('1d8db3bfff5a11efa5222581b6b99794', '园区第三方单位', 'd6334a2be86111ecab01a97e6b14275e');
INSERT INTO  `sys_menu`(`ID`, `MENU_NAME`, `MENU_F`) VALUES ('46358bceeb8311ec955bc1c3f7405d9b', '诚信评价管理', 'd6334a2be86111ecab01a97e6b14275e');
INSERT INTO  `sys_menu`(`ID`, `MENU_NAME`, `MENU_F`) VALUES ('4cccb6e0047311f0a5229bfb3878ccff', '企业第三方单位', 'd6334a2be86111ecab01a97e6b14275e');

 

子节点数据:

INSERT INTO  `sys_menu`(`ID`, `MENU_NAME`, `MENU_F`) VALUES ('52a6d17feb8311ec955b69bcbefe3578', '评价指标管理', '46358bceeb8311ec955bc1c3f7405d9b');
INSERT INTO  `sys_menu`(`ID`, `MENU_NAME`, `MENU_F`) VALUES ('5b953200eb8311ec955bbd4fe2e8971e', '在线评价', '46358bceeb8311ec955bc1c3f7405d9b');

 

INSERT INTO  `sys_menu`(`ID`, `MENU_NAME`, `MENU_F`) VALUES ('1ef39c63e92b11ecbab281108e106637', '人员信息', '4cccb6e0047311f0a5229bfb3878ccff');
INSERT INTO  `sys_menu`(`ID`, `MENU_NAME`, `MENU_F`) VALUES ('2e9fa4aceb8311ec955b73bd7808cf5e', '服务记录', '4cccb6e0047311f0a5229bfb3878ccff');
INSERT INTO  `sys_menu`(`ID`, `MENU_NAME`, `MENU_F`) VALUES ('3db88abdeb8311ec955b632ac810f194', '违规记录', '4cccb6e0047311f0a5229bfb3878ccff');
INSERT INTO  `sys_menu`(`ID`, `MENU_NAME`, `MENU_F`) VALUES ('4d26d607e89311ecab0193a77099ca36', '单位资质', '4cccb6e0047311f0a5229bfb3878ccff');
INSERT INTO  `sys_menu`(`ID`, `MENU_NAME`, `MENU_F`) VALUES ('99763b15eac211ec955b433cf510c4fb', '安全教育培训记录', '4cccb6e0047311f0a5229bfb3878ccff');
INSERT INTO  `sys_menu`(`ID`, `MENU_NAME`, `MENU_F`) VALUES ('e44101cce86111ecab013b110548a782', '基本信息', '4cccb6e0047311f0a5229bfb3878ccff');
INSERT INTO  `sys_menu`(`ID`, `MENU_NAME`, `MENU_F`) VALUES ('ed048b5b232311efbe6b891ce3b9edb0', '第三方单位评价', '4cccb6e0047311f0a5229bfb3878ccff');

 

需求:通过MENU_F = 'd6334a2be86111ecab01a97e6b14275e',查出所有后代

 

实现:

WITH recursive r as (
-- 递归基:由此开始递归
select id,MENU_F,MENU_NAME from sys_menu where MENU_F = 'd6334a2be86111ecab01a97e6b14275e'
union ALL
-- 递归步:关联查询
select c.id,c.MENU_F,c.MENU_NAME
from sys_menu c inner join r
-- r作为父表,c作为子表,所以查询条件是c的parent_id=r.id
where r.id = c.MENU_F
)
select id,MENU_F,MENU_NAME from r

 

image

 

posted @ 2025-08-02 17:25  leocat  阅读(53)  评论(0)    收藏  举报