首页 > 数据库 >sql递归查询-mysql8为例

sql递归查询-mysql8为例

时间:2022-12-03 17:35:29浏览次数:47  
标签:parent 为例 mysql8 t1 河南省 sql 中国 全球 id

总体描述

数据准表

通过CTE实现,当前版本是mariadb 8.0.31 ,于mysql8相当。

数据表(也就是原表):

select * from recurrence a
id parent_id
全球 null
中国 全球
美国 全球
辽宁省 中国
黑龙江省 中国
河南省 中国
郑州市 河南省
洛阳市 河南省
沈阳市 辽宁省
二七区 郑州市
某街道 二七区
某社区 某街道
某小区 某社区
十三栋 某小区

问题

想要查询每个等级的区域对应的全部路径。

代码:


with recursive t1 as(
    select id, parent_id, cast(id as char(200) )as path
    from recurrence a
    where a.parent_id is null
    union all
    select b.id, b.parent_id, cast(concat(t1.path,'->',b.id) as char(200))as path
    from t1 inner join recurrence b on b.parent_id=t1.id
)
select * from t1
;

结果:

id parent_id path
全球 全球
中国 全球 全球->中国
美国 全球 全球->美国
辽宁省 中国 全球->中国->辽宁省
黑龙江省 中国 全球->中国->黑龙江省
河南省 中国 全球->中国->河南省
郑州市 河南省 全球->中国->河南省->郑州市
洛阳市 河南省 全球->中国->河南省->洛阳市
沈阳市 辽宁省 全球->中国->辽宁省->沈阳市
二七区 郑州市 全球->中国->河南省->郑州市->二七区
某街道 二七区 全球->中国->河南省->郑州市->二七区->某街道
某社区 某街道 全球->中国->河南省->郑州市->二七区->某街道->某社区
某小区 某社区 全球->中国->河南省->郑州市->二七区->某街道->某社区->某小区
十三栋 某小区 全球->中国->河南省->郑州市->二七区->某街道->某社区->某小区->十三栋

详解

在临时表中分为两个部分:

  • 查询全球,
  • 递归地查询剩余部分

以下分为详细步骤:

  • 第一: 查询【全球】,此时只有一行。注意这一行数,就是当前t1的全部。

输入:

 select id, parent_id, cast(id as char(200) )as path
    from recurrence a
    where a.parent_id is null

输出:

当前 t1

id parent_id path
全球 null 全球
  • 第二: 查询原表与cte取交集。原表有14行,但是与当前cte有交集的,只有2行。

输入

sql语句:

select b.id, b.parent_id, cast(concat(t1.path,'->',b.id) as char(200))as path
    from t1 inner join recurrence b on b.parent_id=t1.id

表1 当前的 cte

id parent_id path
全球 null 全球

表2: 原表

输出:(也就是当前的t1)

id parent_id path
全球 null 全球
中国 全球 中国->全球
美国 全球 美国->全球
  • 第三步:取 t1 表和原表取交集,注意当前的t1是三行, 原表是物理存储的表因此不变。于是拿到父母是 中国、美国的所行(一共三行),再并入到 t1中。

计算交集的结果:

id parent_id path
辽宁省 中国 全球->中国->辽宁省
黑龙江省 中国 全球->中国->黑龙江省
河南省 中国 全球->中国->河南省

并入到t1中(也就是现在的t1)

id parent_id path
全球 全球
中国 全球 全球->中国
美国 全球 全球->美国
辽宁省 中国 全球->中国->辽宁省
黑龙江省 中国 全球->中国->黑龙江省
河南省 中国 全球->中国->河南省
  • 以此类推,一直到 【十三栋】那一行,无法在原物理表中找到 parent_id ='十三栋' 的行,则停止。并且在临时表外输出所有数据。
id parent_id path
全球 全球
中国 全球 全球->中国
美国 全球 全球->美国
辽宁省 中国 全球->中国->辽宁省
黑龙江省 中国 全球->中国->黑龙江省
河南省 中国 全球->中国->河南省
郑州市 河南省 全球->中国->河南省->郑州市
洛阳市 河南省 全球->中国->河南省->洛阳市
沈阳市 辽宁省 全球->中国->辽宁省->沈阳市
二七区 郑州市 全球->中国->河南省->郑州市->二七区
某街道 二七区 全球->中国->河南省->郑州市->二七区->某街道
某社区 某街道 全球->中国->河南省->郑州市->二七区->某街道->某社区
某小区 某社区 全球->中国->河南省->郑州市->二七区->某街道->某社区->某小区
十三栋 某小区 全球->中国->河南省->郑州市->二七区->某街道->某社区->某小区->十三栋

标签:parent,为例,mysql8,t1,河南省,sql,中国,全球,id
From: https://www.cnblogs.com/heenhui2016/p/16948397.html

相关文章

  • centos8 手动卸载mysql
    首先得停止mysql的服务,然后查找mysql文件用find/-namemysql   rm-rf删掉所有的mysql文件删掉后删除配置文件rm-rf/etc/my.cofrm-rf/etc/init.d/mysql......
  • java——mybatis——动态SQL——动态sql语句-where标签的使用
               ==========================================================================================================     ......
  • java——mybatis——动态SQL——动态sql语句-if标签的使用
         ......
  • Linux 上安装 PostgreSQL
    打开PostgreSQL官网​​https://www.postgresql.org/​​,点击菜单栏上的DownloadLinux我们可以看到支持Ubuntu和RedHat等各个平台,点击具体的平台链接,即可查看安装......
  • mysql 常见锁的类型(一)
    @[toc]一、锁的分类1.1加锁的目的当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况,若对并发操作不加控制就可能会读取和存储不正确的数据,破......
  • MySql 备份还原
    使用SQLyog转储备份SQL文件,在另外一台电脑还原1.还原过程中遇到ErrorCode:1118-Rowsizetoolarge(>8126).ChangingsomecolumnstoTEXTorBLOBmayhelp.I......
  • 安装pymysql报错:File "/usr/local/lib/python2.7/site-packages/PyMySQL-1.0.2-py2.7.
     Traceback(mostrecentcalllast):File"log2user-real.py",line49,in<module>db=create_engine("mysql+pymysql://root:{m_pass}@10.157.2.25:8306/l......
  • 使用python和sqlite处理数据
    1.处理空行python程序importpandasaspd#导入pandas库data=pd.read_excel("PittsburghBridges.xls")#读取表格数据res=data.dropna(how="all")#清除空白......
  • MySQL 常问知识点(简略)
    前言稍微整理一下吧,因为平时关注这方面不多,所以不会很深入事务隔离级别事务中可能遇到的问题脏读同一时间有两个事务A和B,A对某条数据进行修改或增加,在B......
  • Mysql压缩版安装配置
    下载地址:https://downloads.mysql.com/archives/community/ 1.将Mysql压缩包解压出来2.修改mysql配置文件编辑mysql目录下的my.ini文件,按需配置[mysqld]#设置3306......