mariadb 10.2/mysql 8.0实现递归
借助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/。
最新文章
- Xshell显示中文乱码问题
- 推荐一些python Beautiful Soup学习网址
- jQuery.smoove — jQuery和CSS3炫酷滚动页面内容元素动画特效插件
- 20155224聂小益 - 我的技能与C语言学习
- 当执行php脚本时用户关闭浏览器会发生什么?
- (转)C#模拟键盘鼠标事件
- struts2的namespace
- Expect:100-Continue &; HTTP 417 Expectation[转]
- Android判断网络连接状态
- HDOJ 4745 Two Rabbits DP
- hello nodejs
- 学习笔记——单例模式Singleton
- IntelliJ IDEA:给web应用提供JSTL支持
- 在测试crontab执行脚本的时候,修改了linux的系统时间,crontab不执行了。
- 【LDAP】LDAP注入漏洞与防御
- 安装Joomla!3
- java 静态代理总结
- [原创]互联网金融App测试介绍
- JVM中的STW和CMS
- MySQL整理(三)
热门文章
- Java枚举类和注解梳理
- 利用ViewStub实现布局懒惰加载
- spring boot 过滤器、拦截器的区别与使用
- spring的@Scheduled定时任务,同一时间段的定时任务只会执行一个,其余的会被阻塞,@Scheduled注解定时任务并发执行解决办法,即多线程运行定时任务
- 用python+openpyxl从表格中读取测试用例的多条数据,然后将执行结果写入表格中
- python学习类与方法的调用规则
- js元素remove
- WebService(一)
- 八.python文件操作
- [ARIA] aria-describedby &; aria-labelledby