Mysql存储过程生成树路径path


前言

因为项目里面的组织架构表没有保存组织路径,导致写sql查询不易查询上下级所属的数据,因此在组织架构表里面添加了path字段,用来保存该组织的路径path值,然后写存储过程对已有的数据进行了path值的生成


执行的结果如下:
在这里插入图片描述
这是不是就是你想要的结果?接下来解读该存储过程,让你根据自己的意愿去生成自己所想的路径值。

一、先对表添加路径字段

在这里先使用mysql语句添加表字段:
ALTER TABLE ‘组织表’ ADD path varchar(32);
表字段的具体长度根据你自己的需要来定

二、写存储过程

1.代码如下

DROP PROCEDURE IF EXISTS test;
CREATE PROCEDURE test(IN parent int)
BEGIN   
DECLARE path_id INT(255);
DECLARE path_str VARCHAR(255);
DECLARE done INT DEFAULT 0;
DECLARE sums INT DEFAULT 0;
#循环i
DECLARE i INT DEFAULT 0;
#定义游标
DECLARE usr cursor for SELECT team_id from t_team WHERE pid=parent;
#结束标志
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
SELECT COUNT(team_id) AS nums INTO sums from t_team WHERE pid=parent;
SELECT team_path INTO path_str FROM t_team WHERE team_id = parent;
#递归深度
SET @@max_sp_recursion_depth = 50;
#打开游标
OPEN usr;
read_loop: LOOP
IF done=1 THEN    
      LEAVE read_loop;
END IF;
#游标赋值
fetch usr INTO path_id;
UPDATE t_team set team_path = CONCAT(path_str,',',path_id) where team_id=path_id;
IF sums<>i THEN
SET i=i+1;
#递归
CALL test(path_id);
END IF;
END LOOP;
#关闭游标
close usr;
end

执行存储过程 call test(-1),这里的-1代表我表中树的根,你表中树的根的值是什么你就填写该数值。

2.存储过程解读

代码如下:

DROP PROCEDURE IF EXISTS test;#先DROP掉已经存在的存储过程,方便来回测试
CREATE PROCEDURE test(IN parent int)创建存储过程  test为存储过程名称,IN parent int  IN为输入,int为输入的类型
BEGIN   存储过程结构开始
DECLARE path_id INT(255);# 每次需要执行修改的主键id值
DECLARE path_str VARCHAR(255);#路径path值
DECLARE done INT DEFAULT 0;#游标结束标志,DEFAULT 默认值为0
DECLARE sums INT DEFAULT 0;#循环值,有多少子级循环多少遍

接下来是定义游标和开启游标,然后还有loop循环。

DECLARE usr cursor for SELECT team_id from t_team WHERE pid=parent;

这里是定义游标,游标的值为每次递归进来的父级值。

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

结束游标的标志。

SELECT COUNT(team_id) AS nums INTO sums from t_team WHERE pid=parent;

根据父级统计需要被执行修改的子级个数。

SELECT team_path INTO path_str FROM t_team WHERE team_id = parent;

获取父级的路径path,然后拼接和子级的主键id拼接形成路径path。

SET @@max_sp_recursion_depth = 50;

设置该次递归的深度。

#打开游标
OPEN usr;
#开始loop循环,这里也可以用其他的循环
read_loop: LOOP
#判断是否需要跳过此次loop循环
IF done=1 THEN    
      LEAVE read_loop;
#结果if判断
END IF;
#游标赋值给上面定义的path_id
fetch usr INTO path_id;
#执行的UPDATE
UPDATE t_team set team_path = CONCAT(path_str,',',path_id) where team_id=path_id;
#判断是否需要递归
IF sums<>i THEN
SET i=i+1;
#递归
CALL test(path_id);
END IF;
END LOOP;
#关闭游标
close usr;

总结

写文章不易,小伙伴们记得点赞关注哦。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值