猿哥解读

本文的亮点在于很多PHPer肯定不知道MySQL还能这么用。

所周知,目前的mysql版本中并不支持直接的递归查询,但是通过递归到迭代转化的思路,还是可以在一句SQL内实现树的递归查询的。这个得益于Mysql允许在SQL语句内使用@变量。以下是示例代码。

创建表格

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的递归查询的实现全过程,希望对大家的学习有所帮助。

关注PHP技术大全,成长不止一点点!

分享出去,让知识地带无限蔓延!

mysql递归sql_SQL如何实现MYSQL的递归查询,SQL实现MYSQL递归相关推荐

  1. Mysql更新数据库数据sql_一条更新SQL在MySQL数据库中是如何执行的

    前边的在<一条SQL查询在MySQL中是怎么执行的>中我们已经介绍了执行过程中涉及的处理模块,包括连接器.分析器.优化器.执行器.存储引擎等.今天我们来一起看看一条更新语句又是怎么一个执行 ...

  2. sql递归查询(包含mysql、pgsql、oracle)

    一.postgresql 表格式如下 递归sql(向下递归)如下: with recursive p as (select t1.* from t_org_test t1 WHERE t1.id = ...

  3. mysql和linux的题目_最强Linux和Mysql面试题套餐,让你的面试无懈可击!

    引言: 大家好,我是一菲,在软件测试当中linux 操作系统和Mysql数据库的内容是十分的知识同时也是十分重要的.所以一菲这两天通过查阅资料等其他方式为大家梳理了liunx和Mysql面试题大礼包, ...

  4. mysql.data.dll win10_关于Linux和Windows下部署mysql.data.dll的注册问题》

    为了学习ORM,选择了EntityFramework,经历了三天两夜的煎熬,N多次错误,在群里高手的帮助下,终于成功,现在将我的心路历程记录下来,一是让自己有个记录,另外就是让其它人少走些弯路. 我的 ...

  5. mysql root的密码忘了?linux下重置mysql的root用户密码。

    如果忘记了MySQLroot密码,可以用以下方法重新设置: 1.停掉系统里的MySQL进程:killall-TERM mysqld 2.用以下命令启动MySQL,以不检查权限的方式启动:进入到mysq ...

  6. mysql 要使用最新版吗,如何安装最新版MySQL数据库?

    1.进入MySQL安装界面,选择Custom(自定义),然后选择Next进入下一步 自定义 2.选择安装的产品和特性,根据需要进行选择,将需要安装的组件移到右侧 选择安装产品和组件 3.点击已选择安装 ...

  7. ubuntu 更新mysql后无法登陆_更新ubuntu之后无法登陆mysql

    Ubuntu 14.04,更新一些软件之后莫名其妙的mysql无法登陆了,一直显示:"Access denied for user 'root'@'localhost'" 重置ro ...

  8. mysql windows 管道连接,科技常识:Windows Server 2016 MySQL数据库安装配置详细安装教程...

    今天小编跟大家讲解下有关Windows Server 2016 MySQL数据库安装配置详细安装教程 ,相信小伙伴们对这个话题应该也很关注吧,小编也收集到了有关Windows Server 2016 ...

  9. mysql学习一:DB、DBMS、SQL之间的联系

    **DB:**数据库(database)是文件的集合,是依照某种数据模型组织起来并存放于存储器中的数据集合. **DBMS:**数据库管理系统(database manage system)是位于用户 ...

最新文章

  1. java gson使用_Java 中 Gson的使用
  2. 【 NLS 】Newton – Raphson Iteration Procedure of TOA - Based Positioning
  3. Android构建boot.img(一):root目录与ramdisk.img的生成
  4. CentOS 6.x搭建Open***实现双IDC互联
  5. 计算机调试员高级理论知识试卷,电子计算机设备调试员(高级)考核复习题—理论试题.doc...
  6. SparkRDD内核
  7. java容器取交集、并集、补集、差集示例
  8. mysql 一条记录的某个字段为空,是否占用存储
  9. (转)python3之模块io使用流的核心工具
  10. 将酷狗krc歌词转换为lrc格式
  11. linux exosip编译,eXosip2 osip 编译安装
  12. c51单片机矩阵键盘1602计算器_基于AT89C51单片机的十进制计算器系统设计
  13. Snipaste下载安装(使用教程)
  14. Python全栈自动化测试--Pycharm专业版安装
  15. 初识C语言及开始跨考计算机的心路历程
  16. 和苗波玩吉他英雄,还有诺拉斯战士
  17. matlab目标跟踪目标检测项目系统源码合集【33套】
  18. 服务器识别不了移动硬盘
  19. 论语 --- 学而第一
  20. 【软件简史】怎样理解 Alan Kay 曾在1984 年写道:“我们希望像以前编辑文档一样编辑我们的工具” 这句话 —— LLM 将如何影响软件的创建?

热门文章

  1. 会议重点介绍芯片设计中的人工智能
  2. CVPR2020:三维实例分割与目标检测
  3. [JavaScript] Map类型在JavaScript中的使用
  4. 我的世界javamod怎么装_易拉罐装的葡萄酒你们能接受吗?
  5. css float 的使用
  6. tp5+workman
  7. React接入Sentry.js
  8. Linux Centos 7 安装配置nginx
  9. 递归函数 集合 列表 元组
  10. K12(在线学习的平台)