新建一张表:
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 四级节点