MySQL 递归 查询

表结构:



 

插入测试数据脚本:
 

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


递归后的查询结果:

猜你喜欢

转载自blog.csdn.net/CsethCRM/article/details/107561744
今日推荐