现在大家应该都知道mysql版本中已经不支持直接的递归查询了,但是我们可以通过递归到迭代转化的思路是实现树的递归查询,接下来我们就一起去看看SQL实现MYSQL递归查询的方法。

创建表格

CREATE TABLE `treenodes` (

`id` int , -- 节点ID

`nodename` varchar (60), -- 节点名称

`pid` int -- 节点父ID

);

插入测试数据

INSERT INTO `treenodes` (`id`, `nodename`, `pid`) VALUES

('1','A','0'),('2','B','1'),('3','C','1'),

('4','D','2'),('5','E','2'),('6','F','3'),

('7','G','6'),('8','H','0'),('9','I','8'),

('10','J','8'),('11','K','8'),('12','L','9'),

('13','M','9'),('14','N','12'),('15','O','12'),

('16','P','15'),('17','Q','15'),('18','R','3'),

('19','S','2'),('20','T','6'),('21','U','8');

查询语句

SELECT id AS ID,pid AS 父ID ,levels AS 父到子之间级数, paths AS 父到子路径 FROM (

SELECT id,pid,

@le:= IF (pid = 0 ,0,

IF( LOCATE( CONCAT('|',pid,':'),@pathlevel) > 0 ,

SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',pid,':'),-1),'|',1) +1

,@le+1) ) levels

, @pathlevel:= CONCAT(@pathlevel,'|',id,':', @le ,'|') pathlevel

, @pathnodes:= IF( pid =0,',0',

CONCAT_WS(',',

IF( LOCATE( CONCAT('|',pid,':'),@pathall) > 0 ,

SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,CONCAT('|',pid,':'),-1),'|',1)

,@pathnodes ) ,pid ) )paths

,@pathall:=CONCAT(@pathall,'|',id,':', @pathnodes ,'|') pathall

FROM treenodes,

(SELECT @le:=0,@pathlevel:='', @pathall:='',@pathnodes:='') vv

ORDER BY pid,id

) src

ORDER BY id

最后的结果如下:

ID   父ID    父到子之间级数  父到子路径

------    ------     --------------------    -------------------

1       0              0                     ,0

2       1              1                     ,0,1

3       1              1                     ,0,1

4       2              2                     ,0,1,2

5       2              2                     ,0,1,2

6       3              2                     ,0,1,3

7       6              3                     ,0,1,3,6

8       0              0                     ,0

9       8              1                     ,0,8

10       8             1                     ,0,8

11       8             1                     ,0,8

12       9             2                     ,0,8,9

13       9             2                     ,0,8,9

14      12            3                      ,0,8,9,12

15      12            3                     ,0,8,9,12

16      15            4                     ,0,8,9,12,15

17      15            4                     ,0,8,9,12,15

18       3            2                      ,0,1,3

19       2            2                      ,0,1,2

20       6            3                      ,0,1,3,6

21       8            1                      ,0,8

以上就是小编介绍关于SQL实现MYSQL递归查询的方法,希望对大家的学习有所帮助,如果还有疑问,请在本文底部留言吧。

mysql sql语句递归查询语句_SQL实现MYSQL递归查询的方法相关推荐

  1. mysql+sql+子查询语句_SQL子查询

    子查询或内部查询或嵌套查询在另一个SQL查询的查询和嵌入式WHERE子句中. 子查询用于返回将被用于在主查询作为条件的数据,以进一步限制要检索的数据. 子查询可以在SELECT,INSERT,UPDA ...

  2. MYSQL sql 高阶语句 (sequel)

    sql 高阶语句 一.空值(NULL) 和 无值('') 的区别 · 无值的长度为 0,不占用空间的:而 NULL 值的长度是 NULL,是占用空间的. · S NULL 或者 IS NOT NULL ...

  3. mysql sql查询json数据类型_SQL中的JSON数据类型

    SQL中的JSON数据类型 概述 MySQL支持原生JSON类型,使用JSON数据类型相较于将JSON格式的字符串存储在String型中的优势有: 存储时会自动验证JSON文本: 可以优化存储格式.存 ...

  4. mysql sql.gz 解压_linux 安装mysql数据库——tar.gz包解压安装法

    mysql数据库有多种安装方式,本文只介绍在Linux服务器上的tar.gz包解压安装法, 先通过mysql官网或者网络资源下载 mysql-5.7.3-m13-linux-glibc2.5-x86_ ...

  5. mysql sql 去除重复行_SQL查询语句去除重复行

    1.存在两条完全相同的纪录 这是最简单的一种情况,用关键字distinct就可以去掉 select distinct * from table(表名) where (条件) 2.存在部分字段相同的纪录 ...

  6. mysql+sql+子查询语句_SQL语句:子查询

    一,子查询简介: 子查询就是嵌套在主查询中的查询. 子查询可以嵌套在主查询中所有位置,包括SELECT.FROM.WHERE.ORDER BY.但并不是每个位置嵌套子查询都是有意义并实用的. 子查询必 ...

  7. jpa mysql sql分页查询语句_JPA多条件复杂SQL动态分页查询功能

    概述 ORM映射为我们带来便利的同时,也失去了较大灵活性,如果SQL较复杂,要进行动态查询,那必定是一件头疼的事情(也可能是lz还没发现好的方法),记录下自己用的三种复杂查询方式. 环境 spring ...

  8. mysql sql 连接查询语句_Mysql——sql数据库中的连接查询

    1.1.1   交叉连接(CROSS JOIN) 交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的. ...

  9. mysql sql测试_MySQL语句测试——数据查询

    MySQL语句测试--数据查询 3.4 数据查询 一.单表查询 /*1.选择表中的若干列,各个列的先后顺序和语句中列名从左到右的顺序一致 select 目标表达式 from 表名; */ /*(1)s ...

  10. jpa mysql sql分页查询语句_jpa 中 Query 的分页查询和更新

    1,查询分页 注意这个地方nativeQuery=true 代表的是可执行原生sql 先查询出来所有的数据,然后再差个总条数 返回page @Query(nativeQuery = true, val ...

最新文章

  1. 什么是智能医院?如何构建自己的解决方案?
  2. Windows 8 动手实验系列教程 实验8:Windows应用商店API
  3. ICLR2020放榜 34篇满分论文! 48篇orals,108篇spotlights,531篇poster
  4. malloc 初始化_你真的了解 NSObject 对象的初始化吗?
  5. VMware linux虚拟机在线识别新添加磁盘
  6. Linux学习:静态库和动态库
  7. io操作是指什么_各种IO模型,一篇打尽
  8. utm虚拟机安装linux,UTM: 在 iOS 上安装 Windows 或 Linux 等系统及虚机安装过程
  9. 【招聘(重庆)】新空间(重庆)科技有限公司招聘.NET Core
  10. [vb]一些窗口消息的详解
  11. Qt总结之十三:QUDPSocket详解
  12. node中exports和module.exports的关系及使用
  13. stopwords怎么用_【技术】怎么用Python画出好看的词云图?
  14. 如何正确选择气体在线过程分析系统?(下)
  15. Pygame 入门基本指南
  16. 物理Standby数据库的文件路径转换(1)
  17. Win10 高分屏软件界面字体模糊问题解决
  18. 职场管理(3)——提取公积金需要满足哪些条件?你还不知道吧
  19. 在外企上班是一种什么体验?附国内热门外企公司名单!
  20. java编写md5加密解密算法

热门文章

  1. 浅谈C语言函数调用与系统调用
  2. gjb150a盐雾试验标准-产品检验标准国标
  3. python小游戏之一
  4. 使用JAVA工程和KEmulator模拟器开发J2ME项目
  5. 人脸照片不规范、如何更改?pupiIDistanceTooSmall 错误
  6. java结合opencv进行照片人脸检测
  7. 计算机打不开菜鸟打印组件,菜鸟打印常见问题
  8. 谭浩强《C语言程序设计第五版》第一章学习笔记
  9. jsp编程:用Servlet实现用户登陆
  10. 简单MFC程序开发-C++反编译肉鸡养成