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);

结果

MySQL 树状查询指的是一种特殊的查询方式,主要用于处理树形结构的数据。通常在数据库中保存树形结构数据时,我们采用的是一个表中包含一个主键和一个指向它父节点的外键来表示树形结构,这样就可以使用基本的 SQL 查询语句来读取数据。但是,如果我们需要查询树形结构的数据路径,或者需要按照特定的层级关系来显示树形结构,这时候基本的 SQL 查询语句显然无法满足我们的需求。 为了解决这个问题,MySQL 提供了一些专门的树状查询语句,比如使用 WITH RECURSIVE 关键字实现递归查询。具体来说,我们可以通过 WITH RECURSIVE 关键字生成一个递归的子查询,该子查询包含一个递归的 WITH 子句和一个 SELECT 查询。WITH 子句用于定义递归的终止条件和递归查询的初始结果集,而 SELECT 查询则用于不断地将结果集扩展到下一级目录,直到满足终止条件为止。 例如,以下是一个查询包含三个字段 (id、name 和 parent_id) 的树形结构数据表 test_table 中,包含指定节点路径的所有父节点: WITH RECURSIVE recursive_table AS ( SELECT id, name, parent_id FROM test_table WHERE id = 5 UNION ALL SELECT t.id, t.name, t.parent_id FROM recursive_table AS r, test_table AS t WHERE t.id = r.parent_id ) SELECT id, name, parent_id FROM recursive_table; 在上述查询中,我们首先从 test_table 数据表中查找 id=5 的节点,然后创建一个递归的 recursive_table 子查询,从结果集中取出 id、name 和 parent_id 三个字段的值。然后我们使用 UNION ALL 语句将这个初始结果集与一条递归查询语句连接起来,该语句会不断递归地将结果集扩展到下一层目录,直到没有更多的父节点为止。最后,我们在主查询中选取 id、name 和 parent_id 三个字段的值,以显示包含路径的所有父节点。 需要注意的是,使用树状查询语句可能会对数据库服务器的性能产生影响,特别是在处理大型树形结构时。因此,在使用树状查询语句时,我们应该尽可能地限制递归查询的深度和查询条件的复杂度,以避免对数据库性能的不良影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值