返回顶部
首页 > 资讯 > 数据库 >mysql通过@变量实现递归详细实例
  • 313
分享到

mysql通过@变量实现递归详细实例

mysql如何实现递归mysql递归sqlmysql@变量 2023-06-08 10:06:55 313人浏览 独家记忆
摘要

目录1. 测试表结构2. 向下递归(包括自己)3.向下递归(不包括自己)4. 向下递归可能存在问题,修正优化:5. 向上递归所用函数介绍:1、GROUP_CONCAT([distinct] colName)2、F

1. 测试表结构

create table demo
(
    id varchar(100) not null
        primary key,
    parentId    varchar(100) not null
);
-- 测试数据
INSERT INTO demo (ID, parentID) VALUES ('1', '0');
INSERT INTO demo (ID, parentID) VALUES ('10', '9');
INSERT INTO demo (ID, parentID) VALUES ('11', '9');
INSERT INTO demo (ID, parentID) VALUES ('2', '1');
INSERT INTO demo (ID, parentID) VALUES ('3', '2');
INSERT INTO demo (ID, parentID) VALUES ('4', '3');
INSERT INTO demo (ID, parentID) VALUES ('5', '4');
INSERT INTO demo (ID, parentID) VALUES ('6', '5');
INSERT INTO demo (ID, parentID) VALUES ('7', '6');
INSERT INTO demo (ID, parentID) VALUES ('8', '1');
INSERT INTO demo (ID, parentID) VALUES ('9', '1');

2. 向下递归(包括自己)

-- 向下递归 par即为递归查询出来的所有id
SELECT
    @par                                                                          AS par,
    (SELECT @par := GROUP_CONCAT(id) FROM demo WHERE FIND_IN_SET(parentid, @par)) AS son
FROM demo_userm, (SELECT @par := '1') T
WHERE @par IS NOT NULL;
查询结果:
| par       | son     |
| 1         | 2,8,9   |
| 2,8,9     | 10,11,3 |
| 10 ,11,3  | 4       |
| 4         | 5       |
| 5         | 6       |
| 6         | 7       |
| 7         | NULL    |

3.向下递归(不包括自己)

-- 向下递归 par即为递归查询出来的所有id
SELECT
    @par                                                                          AS par,
    (SELECT @par := GROUP_CONCAT(id) FROM demo WHERE FIND_IN_SET(parentid, @par)) AS son
FROM demo_userm, (SELECT @par := '1') T
WHERE @par IS NOT NULL and @par != '1';
查询结果:
| par       | son     |
| 2,8,9     | 10,11,3 |
| 10 ,11,3  | 4       |
| 4         | 5       |
| 5         | 6       |
| 6         | 7       |
| 7         | NULL    |

4. 向下递归可能存在问题,修正优化:

-- 如果存在 par = 51016 并且 son = 51016 , 那么会出现问题,多出许多数据
SELECT
    @par                                                                          AS par,
    (SELECT @par := GROUP_CONCAT(distinct ORG_REFNO) FROM GIS_udp_bank WHERE FIND_IN_SET(PNBRN_ORG_REFNO, @par)) AS son
FROM gis_udp_bank, (SELECT @par := '51016') T
WHERE @par IS NOT NULL;
-- 优化后:后面家条件: !FIND_IN_SET(ORG_REFNO, @par)
SELECT
    @par                                                                          AS par,
    (SELECT @par := GROUP_CONCAT(distinct ORG_REFNO) FROM gis_udp_bank WHERE FIND_IN_SET(PNBRN_ORG_REFNO, @par)
        and !FIND_IN_SET(ORG_REFNO, @par)
        ) AS son
FROM gis_udp_bank, (SELECT @par := '51016') T
WHERE @par IS NOT NULL;

5. 向上递归

SELECT
    @par                                                                     AS par,
    (SELECT @par := GROUP_CONCAT(NAME) FROM demo_userm WHERE LOGoNID = @par) AS son
FROM demo_userm, (SELECT @par := '10') T
WHERE @par IS NOT NULL;
par即为递归查询结果
查询结果:
| par | son |
| 10  | 9   |
| 9   | 1   |
| 1   | 0   |
| 0   | NULL|

所用函数介绍:

1、GROUP_CONCAT([distinct] colName)

一般用于取ID集合。
select  * from demo_userm t where NAME = 1;
| LOGONID | NAME |
| 2       | 1    |
| 8       | 1    |
| 9       | 1    |
select  GROUP_CONCAT(LOGONID) from demo_userm t where NAME = 1;
| GROUP\_CONCAT\(LOGONID\) |
| 2,8,9 |
-- 不去重取name集合
select  GROUP_CONCAT(NAME) from demo_userm t where NAME in (1,2,3,4,5,6,7);
| GROUP\_CONCAT\(NAME\) |
| 1,2,3,4,5,6,1,1 |
-- 去重再取name集合
select  GROUP_CONCAT(distinct NAME) from demo_userm t where NAME in (1,2,3,4,5,6,7);
| GROUP\_CONCAT\(distinct NAME\) |
| 1,2,3,4,5,6 |

2、FIND_IN_SET(colName, strs)

select * from demo_userm where  FIND_IN_SET(LOGONID, ('1,2,3,4'));
| LOGONID | NAME |
| 1       | 0    |
| 2       | 1    |
| 3       | 2    |
| 4       | 3    |
select * from demo_userm where  
FIND_IN_SET(LOGONID, (select  GROUP_CONCAT(LOGONID) from demo_userm t where NAME = 1));
| LOGONID | NAME |
| 2       | 1    |
| 8       | 1    |
| 9       | 1    |

3、#@是用户变量,@@是系统变量。

用户变量赋值有两种方式: 一种是直接用"=“号,另一种是用”:=“号。

其区别在于:

使用set命令对用户变量进行赋值时,两种方式都可以使用; # 用select语句时,只能用”:=“方式,因为select语句中,”="号被看作是比较操作符。

总结

到此这篇关于Mysql通过@变量实现递归的文章就介绍到这了,更多相关mysql @变量实现递归内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: mysql通过@变量实现递归详细实例

本文链接: https://lsjlt.com/news/253627.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • mysql通过@变量实现递归详细实例
    目录1. 测试表结构2. 向下递归(包括自己)3.向下递归(不包括自己)4. 向下递归可能存在问题,修正优化:5. 向上递归所用函数介绍:1、GROUP_CONCAT([distinct] colName)2、F...
    99+
    2023-06-08
    mysql如何实现递归 mysql递归sql mysql @变量
  • C语言详细讲解通过递归实现扫雷的展开
    目录用户选择菜单棋盘初始化布置雷(随机布置)打印棋盘玩家下棋棋盘展开展开部分思维导图展开函数最后一个else return 作用周围雷个数判断用户选择菜单 void menu() {...
    99+
    2024-04-02
  • 详解C语言通过递归与非递归实现蛇形矩阵
    前言: 本次蛇形矩阵我将以两种方法来实现,即非递归和递归 非递归的实现: #define right 1 #define down 2 #define left 3 #defin...
    99+
    2024-04-02
  • 快速排序详解(递归实现与非递归实现)
    目录 一、快速排序的基本思想 二、将序列划分成左右区间的常见方法 2.1hoare版本(动图+解释+代码实现) 2.2挖坑法 2.3前后指针法 三、快速排序的初步实现 四、快速排序的优化实现 4.1快排的特殊情况 4.2对区间划分代码的...
    99+
    2023-10-24
    排序算法 算法 数据结构 c++
  • PyTorch实现线性回归详细过程
    目录一、实现步骤1、准备数据2、设计模型3、构造损失函数和优化器4、训练过程5、结果展示二、参考文献一、实现步骤 1、准备数据 x_data = torch.tensor([[1.0...
    99+
    2024-04-02
  • Python实例详解递归算法
    递归是一种较为抽象的数学逻辑,可以简单的理解为「程序调用自身的算法」。 维基百科对递归的解释是: 递归(英语:Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义...
    99+
    2024-04-02
  • MySQL递归查询的3种实现方式实例
    目录1.建表脚本1.1.建表2.递归查询三种实现方式2.1. 方式一 创建自定义函数实现递归查询2.1.1. 查询子节点的函数 查询时  包含自身 2.1.2. ...
    99+
    2024-04-02
  • C语言怎么通过递归实现扫雷游戏
    这篇“C语言怎么通过递归实现扫雷游戏”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言怎么通过递归实现扫雷游戏”文章吧。用...
    99+
    2023-06-30
  • VUE3+TS递归组件实现TreeList设计实例详解
    目录前言功能分析数据结构实现方式插件式开发插件如何注册插件需要设计那些事件插槽内容插件需要传入那些值支持拖拽功能draggable拖拽相关事件dragStartdragOverdra...
    99+
    2024-04-02
  • Python 递归函数详解及实例
    Python 递归函数 如果一个函数体直接或者间接调用自己,那么这个函数就称为递归函数.也就是说,递归函数体的执行过程中可能会返回去再次调用该函数.在python里,递归函数不需要任何特殊的语法,但是它需要...
    99+
    2022-06-04
    递归 详解 函数
  • C#实现递归算法经典实例
    目录一 、递归算法简介二 、Fibonacci数列和阶乘1、Fibonacci数列2、阶乘三 、汉诺塔问题四 、排列组合1、输出任意个数字母、数字的全排列2、将全排列结果保存到链表中...
    99+
    2024-04-02
  • MySQL中怎么实现存储过程递归调用
    今天就跟大家聊聊有关MySQL中怎么实现存储过程递归调用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 有分类表tb_system_cat...
    99+
    2024-04-02
  • Java递归来实现汉诺塔游戏,注释详细
    我们很容易能想到,可以用递归来实现汉诺塔游戏。因为要将n(n>1)个盘子从“源”柱子移到“目标”柱子,我们要先把n-1个盘子从“源”柱子移到“辅助”柱子上,然后把最底下那一个盘...
    99+
    2024-04-02
  • SpringBoot通过@Value实现给静态变量注入值详解
    目录一、简介二、@Value给静态变量注入值方案一方案二三、总结一、简介 SpringBoot 中给普通变量注入值只需在变量上添加 @Value 注解即可。 application....
    99+
    2024-04-02
  • C++ 函数的递归实现:尾递归在实际应用中的示例?
    c++++中的尾递归优化:尾递归是一种函数在调用自身后立即返回的优化技术。通过指定noinline关键字,可在c++中实现尾递归,提高性能。实战案例:使用尾递归计算阶乘,该阶乘定义为从1...
    99+
    2024-04-22
    c++ 递归
  • C语言递归实现归并排序详解
    归并排序递归实现还是比较难理解的,感觉涉及递归一般理解起来都会比较有难度吧,但是看了b站视频,然后照着打下来,然后自己写了点注释,就发现不知不觉都大概懂了。 这里的归并讲的是升序排序...
    99+
    2024-04-02
  • C++ 函数的递归实现:递归的经典谜题示例?
    递归是一种编程技术,它允许函数调用自身以解决复杂问题,通过分解成子问题来实现。实战案例中,汉诺塔谜题的递归实现:1. 当只有一个圆盘时,直接移动到目标塔。2. 将小圆盘移动到辅助塔。3....
    99+
    2024-04-22
    c++ 递归
  • C++ 函数递归详解:递归调用的形式和实现
    递归是函数自身调用的一种编程技术,在 c++++ 中有两种常见形式:直接递归和间接递归。要实现递归,函数必须满足基线条件和递归调用。实战案例中,利用递归计算阶乘,其基线条件是 n 为 0...
    99+
    2024-05-04
    c++ 递归
  • Shell eval通过变量获取环境变量的方法实现
    场景 系统中存在环境变量 USER=iceber 脚本中存在一个变量 env_name=USER 需要通过变量 env_name 获取到环境变量 USER rvLjqm的值 错误示例 $ # 环境中已...
    99+
    2022-06-04
    Shell eval获取环境变量
  • mysql实现递归查询的方法
    小编给大家分享一下mysql实现递归查询的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!mysql实现递归查询的方法:首先创建表,并初始化数据;然后向下递归,利用【find_in_set(...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作