MYSQL树状查询
来源:互联网 发布:奥迪a8矩阵式led大灯 编辑:程序博客网 时间:2024/06/12 18:14
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);
结果