1)新建表结构
CREATE TABLE `monitor_menu` ( `id` varchar(45) NOT NULL DEFAULT '0' COMMENT '主键ID', `menu_name` varchar(45) DEFAULT NULL COMMENT '名称', `parent_id` varchar(45) DEFAULT NULL COMMENT '父级ID', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='树结构数据表';
2)添加测试数据
INSERT INTO `jsbz`.`monitor_menu`(`id`, `menu_name`, `parent_id`) VALUES ('1001', '一级目录', '0');
INSERT INTO `jsbz`.`monitor_menu`(`id`, `menu_name`, `parent_id`) VALUES ('1002', '二级目录1', '1001');
INSERT INTO `jsbz`.`monitor_menu`(`id`, `menu_name`, `parent_id`) VALUES ('1003', '二级目录2', '1001');
INSERT INTO `jsbz`.`monitor_menu`(`id`, `menu_name`, `parent_id`) VALUES ('1004', '二级目录3', '1001');
INSERT INTO `jsbz`.`monitor_menu`(`id`, `menu_name`, `parent_id`) VALUES ('1005', '三级目录1', '1002');
INSERT INTO `jsbz`.`monitor_menu`(`id`, `menu_name`, `parent_id`) VALUES ('1006', '三级目录2', '1003');
INSERT INTO `jsbz`.`monitor_menu`(`id`, `menu_name`, `parent_id`) VALUES ('1007', '三级目录3', '1004');
3)根据指定ID查询所有父节点数据
monitor_menu:树结构表
1005:指定查询ID
SELECT T2.* FROM ( SELECT @r AS _id, ( SELECT @r := parent_id FROM monitor_menu WHERE id = _id ) AS parent_id, @l := @l + 1 AS lvl FROM ( SELECT @r := '1005', @l := 0 ) vars, monitor_menu h WHERE @r <> 0 ) T1 JOIN monitor_menu T2 ON T1._id = T2.id ORDER BY T1.lvl DESC
返回结果如下:
4)根据指定ID查询所有子节点数据
monitor_menu:树结构表
1001:指定查询ID
创建一个存储过程
DROP FUNCTION IF EXISTS `getChildrenList`; CREATE FUNCTION `getChildrenList` (rootId VARCHAR ( 1000 )) RETURNS VARCHAR ( 1000 ) BEGIN DECLARE sTemp VARCHAR ( 1000 ); DECLARE sTempChd VARCHAR ( 1000 ); SET sTemp = '$'; SET sTempChd = cast( rootId AS CHAR ); WHILE sTempChd IS NOT NULL DO SET sTemp = concat( sTemp, ',', sTempChd ); SELECT group_concat( id ) INTO sTempChd FROM monitor_menu WHERE FIND_IN_SET( parent_id, sTempChd )> 0; END WHILE; RETURN sTemp; END
select * from monitor_menu where FIND_IN_SET(id,getChildrenList('1001'))
返回结果如下: