借助mysql 8.0的cte(它是iso sql标准的一部分),可以实现递归,mariadb 10.2.2开始支持递归cte,如下:

+----+----------+--------------+
| ID | ParentID | name         |
+----+----------+--------------+
|  1 |        0 | 河南省       |
|  2 |        1 | 信阳市       |
|  3 |        2 | 淮滨县       |
|  4 |        3 | 芦集乡       |
|  5 |        1 | 安阳市       |
|  6 |        5 | 滑县         |
|  7 |        6 | 老庙乡       |
|  8 |        2 | 固始县       |
|  9 |        8 | 李店乡       |
| 10 |        2 | 息县         |
| 11 |       10 | 关店乡       |
| 12 |        3 | 邓湾乡       |
| 13 |        3 | 台头乡       |
| 14 |        3 | 谷堆乡       |
| 15 |        1 | 南阳市       |
| 16 |       15 | 方城县       |
| 17 |        1 | 驻马店市     |
| 18 |       17 | 正阳县       |
+----+----------+--------------+

由下而上

sql:

with recursive r as 
(
select * from c where id =11 
union all 
select c.* from c,r where c.id=r.ParentID
) select * from r order by id;

result:

+------+----------+-----------+
| ID   | ParentID | name      |
+------+----------+-----------+
|    1 |        0 | 河南省    |
|    2 |        1 | 信阳市    |
|   10 |        2 | 息县      |
|   11 |       10 | 关店乡    |
+------+----------+-----------+

由上而下

sql:

with recursive r as
(
select id,name from c where id=1
union all 
select c.id,CONCAT(r.name, '>', c.name) as name from c,r where r.id = c.ParentID
)select id,name from r;

result:

+------+-----------------------------------------+
| id   | name                                    |
+------+-----------------------------------------+
|    1 | 河南省                                  |
|    2 | 河南省>信阳市                           |
|    5 | 河南省>安阳市                           |
|   15 | 河南省>南阳市                           |
|   17 | 河南省>驻马店市                         |
|    3 | 河南省>信阳市>淮滨县                    |
|    6 | 河南省>安阳市>滑县                      |
|    8 | 河南省>信阳市>固始县                    |
|   10 | 河南省>信阳市>息县                      |
|   16 | 河南省>南阳市>方城县                    |
|   18 | 河南省>驻马店市>正阳县                  |
|    4 | 河南省>信阳市>淮滨县>芦集乡             |
|    7 | 河南省>安阳市>滑县>老庙乡               |
|    9 | 河南省>信阳市>固始县>李店乡             |
|   11 | 河南省>信阳市>息县>关店乡               |
|   12 | 河南省>信阳市>淮滨县>邓湾乡             |
|   13 | 河南省>信阳市>淮滨县>台头乡             |
|   14 | 河南省>信阳市>淮滨县>谷堆乡             |
+------+-----------------------------------------+

完整原理大家可以参考https://mariadb.com/kb/en/library/recursive-common-table-expressions-overview/。

mariadb 10.2/mysql 8.0实现递归的更多相关文章

  1. MySQL与MariaDB核心特性比较详细版v1.0(覆盖mysql 8.0/mariadb 10.3,包括优化、功能及维护)

    注:本文严禁任何形式的转载,原文使用word编写,为了大家阅读方便,提供pdf版下载. MySQL与MariaDB主要特性比较详细版v1.0(不含HA).pdf 链接:https://pan.baid ...

  2. MySQL 8.0有什么新功能

    https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/ 我们自豪地宣布MySQL 8.0的一般可用性. 现在下载 ...

  3. 从MySQL 5.5迁移到Mariadb 10.1.14

    从MySQL 5.5迁移到Mariadb 10.1.14 迁移计划如下: 1.备份MySQL 5.5的数据库,对指定库进行备份. 2.还原到Mariadb,然后建立复制. 3.然后就可以愿意啥时候切换 ...

  4. Cenos7 编译安装 Mariadb Nginx PHP Memcache ZendOpcache (实测 笔记 Centos 7.0 + Mariadb 10.0.15 + Nginx 1.6.2 + PHP 5.5.19)

    环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7.0-1406-x86_64-DVD.iso 安装步骤: 1.准备 1.1 显示系统版 ...

  5. CentOS7 编译安装 Mariadb (实测 笔记 Centos 7.0 + Mariadb 10.0.15)

    环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7.0-1406-x86_64-DVD.iso 安装步骤: 1.准备 1.1 显示系统版 ...

  6. SQLServer2012 和 MariaDB 10.0.3 分页效率的对比

    1. 实验环境      R910服务器, 16G内存 SqlServer 2012   64bit MariaDB 10.0.3   64bit  (InnoDB) 2. 实验表情况 rtlBill ...

  7. MariaDB——(三) MariaDB 10.0.15 standard replication主从复制搭建

    最近看了一下MariaDB的常规复制章节,就按部就班的搭建了一下最简单的主从复制.需要的硬件环境很简单(在虚拟机VMware中搭建): 1:两台server:Master: 192.168.6.133 ...

  8. mysql 5.7/percona server/mariadb 10.2安装与服务器参数优化

    建议使用percona server linux generic版,从https://www.percona.com/downloads/Percona-Server-LATEST/下载,现在不在推荐 ...

  9. centos6.5环境使用RPM包离线安装MariaDB 10.0.20

    1. 进入MariaDB官网下载MariaDB需要的RPM包 2. 使用下载软件下载所需要的RPM包, 总共4个, 并上传到CentOS主机指定目录. MariaDB-10.0.20-centos6- ...

随机推荐

  1. C#创建DataTable(转载)

    来源:https://www.cnblogs.com/xietianjiao/p/11213121.html方法一: DataTable tblDatas = new DataTable(" ...

  2. Xmind8安装和破解(Windows下)

    如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ 如果解决不了,可以在文末进群交流. 一.准备工作:软件.补丁下载及安装  Xmind8官方下载地址:https://www.xmi ...

  3. VMware 设置虚拟机Centos 上网的两种方式

    能在VMware上面安装虚拟机,不可能说是不让链接外网,只是在自己电脑上玩玩就可以了.因为学习需要,经常在自己笔记本上面搭建虚拟机,我经常使用的两种上网方式 一 NET方式上网 设置VMware Ne ...

  4. manjaro跳坑记

    why manjaro 有两个原因: 我的电脑上win10+ubuntu16.04,ubuntu上跑一个程序会crash导致重启,不知道如何排查,想换个系统试试.(别人机器上同样G++版本不会cras ...

  5. python编程之字符bytes转换str问题

    之前学习bytes转换str的时候,场景比较简单,这次是python中使用subprocess模块输出Linux下的执行命令的结果,默认是bytes类型,因此输出的结果并不是我们想要的,bytes的输 ...

  6. 洛谷 P2921 在农场万圣节Trick or Treat on the Farm题解

    题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定 ...

  7. linux用户的问题

    最近在开发的时候遇到一个问题: 我在某个项目下的某个文件夹内写了一个可以单独run的A.py文件,这个文件里面的代码可以调用kubernetes的python接口来请求kubernetes上的信息(比 ...

  8. js实现文本框自动显示两位小数

    转自https://blog.csdn.net/qiji2011/article/details/81270552 1.js: //保留2位小数,如:2,会在2后面补上00.即2.00 functio ...

  9. js function 参数

    JS 中 函数的调用非常完美, 例如 var myFun=function( num1,num2){ return num1+num2;} 调用喊出 1) myFun(1,1) 2) myFun(); ...

  10. python写入excel(方式1)

    import xlsxwriter li=["张三","李四","王五","周六","王琪",&qu ...