新建一张表:
CREATE TABLE `tree` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`parent_id` int(11) NOT NULL,
`name` varchar(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
新建一个function(参考https://jingyan.baidu.com/article/647f01158ee0da7f2148a80b.html):
drop FUNCTION if EXISTS getChildLst;
CREATE FUNCTION `getChildLst`(rootId INT)
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 tree where FIND_IN_SET(parent_id,sTempChd)>0;
END WHILE;
RETURN sTemp;
END ;
灌入数据:
id parent_id name
1 0 根节点
2 1 一级节点
3 1 一级节点
4 1 一级节点
5 3 二级节点
6 4 二级节点
7 2 二级节点
8 5 三级节点
9 5 三级节点
10 5 三级节点
11 6 三级节点
12 11 四级节点
13 10 四级节点
查询id为1的节点的子节点id拼接串:select getChildLst(1));
结果:^,1,2,3,4,5,6,7,8,9,10,11,12,13
查询树形数据结果:select * from tree where FIND_IN_SET(id, getChildLst(5));
结果:
id parent_id name
5 3 二级节点
8 5 三级节点
9 5 三级节点
10 5 三级节点
13 10 四级节点