表结构:
插入测试数据脚本:
insert treedemo (pid,name) values(0,'根节点');
insert treedemo (pid,name) values(1,'Level-1');
insert treedemo (pid,name) values(2,'Level-1:01');
insert treedemo (pid,name) values(2,'Level-1:02');
insert treedemo (pid,name) values(1,'Level-2');
insert treedemo (pid,name) values(3,'Level-2:01');
insert treedemo (pid,name) values(3,'Level-2:02');
递归SQL:
SELECT id AS ID,pid AS ParentId ,levels AS Depth, paths AS 父到子路径,nodename FROM (
SELECT id,pid,
@le:= IF (pid = 0 ,0,
IF( LOCATE( CONCAT('|',pid,':'),@pathlevel) > 0 ,
SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',pid,':'),-1),'|',1) +1
,@le+1) ) levels
, @pathlevel:= CONCAT(@pathlevel,'|',id,':', @le ,'|') pathlevel
, name nodename
, @pathnodes:= IF( pid =0,',0',
CONCAT_WS(',',
IF( LOCATE( CONCAT('|',pid,':'),@pathall) > 0 ,
SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,CONCAT('|',pid,':'),-1),'|',1)
,@pathnodes ) ,pid ) )paths
,@pathall:=CONCAT(@pathall,'|',id,':', @pathnodes ,'|') pathall
FROM treedemo,
(SELECT @le:=0,@pathlevel:='', @pathall:='',@pathnodes:='') vv
ORDER BY pid,id
) src
ORDER BY id
递归后的查询结果: