mysql5.0自定义存储过程实现递归

news2024/11/16 19:30:39

mysql8.0以上才有查询树形结构数据的递归函数RECURSIVE,比如需求是查询一张树形结构表的级别名称上下层级关系路径:

WITH RECURSIVE subordinates AS (
  SELECT id, region_name, parent_id, CAST(region_name AS CHAR(200)) AS path
  FROM mr_industry_region
  WHERE parent_id  = -1 and id = 67652
    UNION all 
  SELECT e.id, e.region_name, e.parent_id, CONCAT(s.path, '/', e.region_name)
  FROM mr_industry_region e
  JOIN subordinates s ON e.parent_id = s.id
)
SELECT id, region_name, path
FROM subordinates;

图中红色的部分替换为需要查询的表即可,字段也根据需要替换

核心字段是id,parent_id

region_name则是级别名称字段

subordinates是递归中用到的临时表的别名,可随意替换

以上sql查询的结果如下

 

可以看到mysql8.0以上借助函数RECURSIVE实现递归查询还是比较简单的

8.0以下要想完全通过sql实现递归查询,则需要通过存储过程来实现,使用游标实现递归向下查询

实现递归的存储过程如下

CREATE PROCEDURE get_tree_recursive(IN current_id INT, IN inputLevel INT,IN path VARCHAR(255))
BEGIN
    -- 自定义结束标志
    DECLARE done BOOLEAN  DEFAULT FALSE;
    -- 自定义游标赋值变量
    DECLARE currentId INT;
    DECLARE regionName varchar(255);
    DECLARE parentId INT;
    DECLARE curLevel INT;
    -- 自定义游标
    DECLARE cur CURSOR FOR
        SELECT id, region_name, parent_id,level
        FROM mr_industry_region
        WHERE parent_id = current_id and level = inputLevel;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;

        -- 创建临时表
    CREATE TEMPORARY TABLE IF NOT EXISTS temp_mr_industry_region
    (
        id        INT PRIMARY KEY,
        region_name   VARCHAR(255),
        parent_id INT,
                path   VARCHAR(255),
        level     INT
    );

    OPEN cur;

    read_loop:
    LOOP
        FETCH cur INTO currentId, regionName, parentId, curLevel;
        IF done THEN
            LEAVE read_loop;
        END IF;
        INSERT INTO temp_mr_industry_region (id, region_name, parent_id, path,level)
        VALUES (currentId, regionName, parentId,concat(path,'/',regionName), curLevel);
        CALL get_tree_recursive(currentId, inputLevel + 1,concat(path,'/',regionName));
    END LOOP;

    CLOSE cur;

END;

 这个存储过程实现了递归调用,其中level字段是层级字段,没有的话可以删除,参数也一并删除即可,region_name对应的还是级别名称,替换为自己的表级别名称字段

CREATE PROCEDURE get_tree()
BEGIN
    -- 自定义结束标志
    DECLARE done BOOLEAN DEFAULT FALSE;
    -- 自定义游标赋值变量
    DECLARE currentId INT;
    DECLARE regionName varchar(255);
    DECLARE parentId INT;
    DECLARE curLevel INT;
    -- 自定义游标,查询所有首级进行游标循环
    DECLARE cur CURSOR FOR
        SELECT id, region_name, parent_id, level
        FROM mr_industry_region
        WHERE parent_id = -1;-- 自行修改条件


    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
        

    OPEN cur;
    read_loop:
    LOOP
        FETCH cur INTO currentId, regionName, parentId, curLevel;
        IF done THEN
            LEAVE read_loop;
        END IF;
        INSERT INTO temp_mr_industry_region (id, region_name, parent_id,path, level)
        VALUES (currentId, regionName, parentId,regionName, curLevel);
        CALL get_tree_recursive(currentId, curLevel + 1,regionName);
    END LOOP;
    CLOSE cur;
END;
 

这个存储过程get_tree()是递归的启动入口,主要是把首层级查询出来,再调用实现递归的存储过程get_tree_recursive()

执行语句如下:

set SESSION max_sp_recursion_depth=20;

call get_tree();

第一句是mysql要求的递归设置层级深度,session是只在当前sql会话窗口有效,全局的则替换为global,同时账号也需要最高权限,set SESSION max_sp_recursion_depth=20; 我这里设置的是20,不设置默认是0,存储过程无法执行。

第二句则是开始调用存储过程

执行完毕后查看临时表temp_mr_industry_region

注意:level字段如果没有,则把两个存储过程和level有关的字段,参数,游标变量等都 删除,重新执行存储过程即可,数据只能生成一次,重复生成报错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1430311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机设计大赛 深度学习 python opencv 火焰检测识别

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

nba2k24 灌篮高手Q版流川枫面补

nba2k24 灌篮高手Q版流川枫面补 此面补nba2k23-nba2k24通用 下载地址: https://www.changyouzuhao.cn/9979.html

利用VPN设备漏洞入侵!新型勒索软件CACTUS攻击手法分析

近期,亚信安全应急响应中心截获了利用VPN设备已知漏洞传播的新型勒索软件CACTUS,该勒索于2023年3月首次被发现,一直保持着活跃状态。CACTUS勒索软件通过Fortinet VPN的已知漏洞进行入侵(黑客首先获取到VPN账号,再通过V…

20240130在ubuntu20.04.6下卸载NVIDIA显卡的驱动

20240130在ubuntu20.04.6下卸载NVIDIA显卡的驱动 2024/1/30 12:58 缘起,为了在ubuntu20.4.6下使用whisper,以前用的是GTX1080M,装了535的驱动。 现在在PDD拼多多上了入手了一张二手的GTX1080,需要将安装最新的545的驱动程序&#…

ctfshow web-77

开启环境: 先直接用伪协议获取 flag 位置。 c?><?php $anew DirectoryIterator("glob:///*"); foreach($a as $f) {echo($f->__toString(). );} exit(0); ?> 发现 flag36x.txt 文件。同时根目录下还有 readflag&#xff0c;估计需要调用 readflag 获…

图灵之旅--ArrayList顺序表LinkedList链表栈Stack队列Queue

目录 线性表顺序表ArrayList简介ArrayList使用ArrayList的构造ArrayList常见操作ArrayList的遍历ArrayList的扩容机制利用ArrayList洗牌ArrayList的优缺点 链表链表的实现双向链表的实现 LinkedListLinkedList引入LinkedList的使用LinkedList的构造LinkedList的常用方法介绍Lin…

五、图像像素算术操作

算术操作无非就是像数值之间的加减乘除操作 一、创建图像像素算术操作——头文件 在项目的头文件中&#xff0c;右击添加&#xff0c;新建项 创建用于图像像素算术操作的头文件&#xff0c;我这边是operater.h 该头文件声明了一个Operater类(class Operater)&#xff0c;该…

ConcurrentModificationException异常原因,解决方法,线程安全的单例模式

异常简介 ConcurrentModificationException&#xff08;并发修改异常&#xff09;是基于java集合中的 快速失败&#xff08;fail-fast&#xff09; 机制产生的&#xff0c;在使用迭代器遍历一个集合对象时&#xff0c;如果遍历过程中对集合对象的内容进行了增删改&#xff0c;…

2023年度总结 | 关于意义,爱与回望——写给清醒又无知的20岁

Hi&#xff0c;大家好&#xff0c;我是半亩花海&#xff0c;一名再普通不过的大学生。2023年&#xff0c;20岁&#xff0c;充实而零乱的一年&#xff0c;清醒又无知的一年。年末&#xff0c;最近的一些事儿也让我逐渐地有感而发&#xff0c;心静&#xff0c;除杂&#xff0c;思…

2024年美国大学生数学建模比赛MCM问题B:搜索潜水器-思路解析与代码解答

2024 MCM Problem B Searching for Submersibles 一、题目翻译 背景&#xff1a; 总部位于希腊的小型海上巡航潜艇&#xff08;MCMS&#xff09;公司&#xff0c;制造能够将人类运送到海洋最深处的潜水器。潜水器被移动到该位置&#xff0c;并不受主船的束缚。MCMS现在希望用…

HTTP和HTTPS区别!

http 是我们几乎天天都要打交道的东西&#xff0c;相关知识点有点多&#xff0c;所以也有不少面试必问的点&#xff0c;这里做了一些整理&#xff0c;帮且大家树立完整的 http 知识体系&#xff0c;对面试官说 so easy HTTP 的特点和缺点 特点&#xff1a;无连接、无状态、灵…

【HarmonyOS应用开发】Web组件的使用(十三)

文章末尾含&#xff1a;Web组件抽奖案例&#xff08;ArkTS&#xff09;-示例源码下载 Web组件的使用 一、概述 相信大家都遇到过这样的场景&#xff0c;有时候我们点击应用的页面&#xff0c;会跳转到一个类似浏览器加载的页面&#xff0c;加载完成后&#xff0c;才显示这个页…

vivado 运行编译

运行合成 运行定义并配置在合成过程中使用的设计方面。一个合成run定义了以下内容&#xff1a; •AMD设备在合成过程中成为目标 •要应用的约束集 •启动单个或多个合成运行的选项 •控制合成引擎结果的选项 要定义RTL源文件和约束的运行&#xff0c;请执行以下操作&…

Java 数据结构 二叉树(二)红黑树

目录 数据结构图-树 简介 规则 旋转 重新着色 红黑树构建过程 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡&#xff0c;忘记了停下脚步&#xf…

关于华为应用市场上架,申请权限未告知目的被驳回问题的简单处理方式

关于华为应用市场上架过程中出现的【您的应用在运行时&#xff0c;未同步告知权限申请的使用目的&#xff0c;向用户索取&#xff08;存储、拍照&#xff09;等权限&#xff0c;不符合华为应用市场审核标准。】 使用方式&#xff1a; 1、引入 import permision from "/m…

配置实例—交换机VLAN聚合配置实例

一、组网需求 某公司拥有多个部门且位于同一网段&#xff0c;为了提升业务安全性&#xff0c;将不同部门的用户划分到不同VLAN中。现由于业务需要&#xff0c;不同部门间的用户需要互通。如图1所示&#xff0c;VLAN2和VLAN3为不同部门&#xff0c;现需要实现不同VLAN间的用户可…

【MySQL】学习如何通过DQL进行数据库数据的基本查询

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-KvH5jXnPNsRtMkOC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

Java学习day28:线程池Pool(知识点非常非常的详解)

声明&#xff1a;该专栏本人重新过一遍java知识点时候的笔记汇总&#xff0c;主要是每天的知识点题解&#xff0c;算是让自己巩固复习&#xff0c;也希望能给初学的朋友们一点帮助&#xff0c;大佬们不喜勿喷(抱拳了老铁&#xff01;) 往期回顾 Java学习day27&#xff1a;join方…

YOLOv5算法进阶改进(15)— 引入密集连接卷积网络DenseNet

前言:Hello大家好,我是小哥谈。DenseNet(密集连接卷积网络)是一种深度学习神经网络架构,它在2017年由Gao Huang等人提出。DenseNet的核心思想是通过密集连接(dense connection)来促进信息的流动和共享。在传统的卷积神经网络中,每个层的输入只来自于前一层的输出。而在…

c语言---操作符(详解)

目录 一、操作符的分类二、算术操作符三、 移位操作符3.1<<左移操作符3.1.1移位规则3.1.2直接上代码以及解释 3.2>> 右移操作符3.2.1移位规则3.2.2画图解释 3.3注意 四、位操作符&#xff1a;&、|、^、~4.1&按位与4.1.1按位与的计算逻辑4.1.2代码4.1.3运行…