MYSQL树状查询



 oracle中可以采用connect by 来进行树状查询,在MYSQL中却没有提供该功能,但是,使用存贮过程我们也可以实现该查询。

创建一张表 fd_id varchar(50)--主键,fd_name varchar(50),fd_parentid varchar(20);

 

创建存贮过程:

 

drop procedure if exists   findLChild;
/* iid 递归父节点 , layer 允许递归深度 */

CREATE PROCEDURE findLChild(iid varchar(50),layer bigint(20))
BEGIN
    /*创建接受查询的临时表 */
    create temporary  table if not exists tmp_table(id varchar(50),name varchar(50)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    /*最高允许递归数*/
    SET @@max_sp_recursion_depth = 10 ;
     call iterative(iid,layer);/*核心数据收集*/
    select * from tmp_table ;/* 展现 */
    drop temporary  table if  exists   tmp_table ;/*删除临时表*/
   END;


drop procedure if exists   iterative ;
CREATE PROCEDURE iterative(iid varchar(50),layer bigint(20))
    BEGIN
  	 declare tid varchar(50) default iid ;
         declare tname varchar(50) character set utf8;

         /* 游标定义 */
         declare cur1 CURSOR FOR select fd_id,fd_name from sys_org_element where fd_parentid=iid ;
         declare CONTINUE HANDLER FOR SQLSTATE '02000' SET tid = null;
      
      /* 允许递归深度 */
      if layer>0 then
         OPEN cur1 ;
         FETCH cur1 INTO tid,tname ;
           WHILE ( tid is not null ) 
              DO
              /* 核心数据收集 */
           insert into tmp_table values(tid,tname);
               call iterative(tid,layer-1);
              FETCH cur1 INTO tid,tname ;
           END WHILE;
       end if;
    END;

 

调用存贮过程:call findLChild('12d8385f65a85c497d232ef4294ac737',5);

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值