首页 > 数据库 >mysql with recursive 递归用法

mysql with recursive 递归用法

时间:2023-02-04 12:05:24浏览次数:38  
标签:parent division ad2 name 递归 sn mysql administrative recursive


with recursive 是一个递归的查询子句,他会把查询出来的结果再次代入到查询子句中继续查询。

语法:

WITH RECURSIVE  cte_name  AS ( 
初始语句(非递归部分)
UNION ALL
递归部分语句
)
[ SELECT| INSERT | UPDATE | DELETE]

例子1:

WITH RECURSIVE cte (n) AS
(
SELECT 1
UNION ALL
SELECT n + 1 FROM cte WHERE n < 5
)
SELECT * FROM cte;

mysql with recursive 递归用法_递归


该语句书写包括如下几步

  1. 设定递归语法,首先初始执行第一句​​SELECT 1​​​,也可以写成​​select xxx from xxx where xxx​
  2. 其结果给到n,当n值发生改变,就会执行:​​SELECT n + 1 FROM cte WHERE n < 5​
  3. 最终结果给到n输出

注意:WITH AS () 后面必须跟着 [ SELECT| INSERT | UPDATE | DELETE] 语句,否则报错。

例子2:

有如下行政区划表

create table administrative_division2
(
administrative_division_sn bigint not null comment '行政区划代码'
primary key,
parent_administrative_division_sn bigint null comment '上级行政区划代码',
status tinyint default 1 not null comment '状态',
name varchar(28) not null comment '名称*',
full_name varchar(200) null comment '行政区划全路径名称,省市县全路径名称'
)
comment '行政区划';

INSERT INTO administrative_division2 (administrative_division_sn, parent_administrative_division_sn, status, name, full_name) VALUES (110000, null, 1, '北京市', '');
INSERT INTO administrative_division2 (administrative_division_sn, parent_administrative_division_sn, status, name, full_name) VALUES (110100, 110000, 1, '北京市市辖区', '');
INSERT INTO administrative_division2 (administrative_division_sn, parent_administrative_division_sn, status, name, full_name) VALUES (110101, 110100, 1, '东城区', '');
INSERT INTO administrative_division2 (administrative_division_sn, parent_administrative_division_sn, status, name, full_name) VALUES (110102, 110100, 1, '西城区', '');
INSERT INTO administrative_division2 (administrative_division_sn, parent_administrative_division_sn, status, name, full_name) VALUES (110105, 110100, 1, '朝阳区', '');

mysql with recursive 递归用法_递归_02


我们想补充​​full_name​​的值变成如下

mysql with recursive 递归用法_数据库_03


那么可以用如下语句

update administrative_division2 ad,(
with recursive res as (select administrative_division_sn sn, parent_administrative_division_sn pSn, name
from administrative_division2 ad
where parent_administrative_division_sn is null
union
select ad2.administrative_division_sn as sn,
ad2.parent_administrative_division_sn pSn,
concat(res.name, ad2.name) as name
from res
inner join administrative_division2 ad2
on res.sn = ad2.parent_administrative_division_sn)
select * from res
) as t1 set ad.full_name=t1.name where ad.administrative_division_sn=t1.sn;

该语句执行解析如下

  1. 先设定开始的条件为父ID为空,即所有的父节点
select administrative_division_sn sn, parent_administrative_division_sn pSn, name from administrative_division2 ad where parent_administrative_division_sn is null
  1. 设置循环的条件为等于这个父节点的子节点
select ad2.administrative_division_sn as sn, ad2.parent_administrative_division_sn pSn, concat(res.name, ad2.name) as name from res inner join administrative_division2 ad2 on res.sn = ad2.parent_administrative_division_sn
  1. 执行完2此时的res.sn就等于子sn了,然后递归执行2
  2. 最终执行​​set ad.full_name=t1.name where ad.administrative_division_sn=t1.sn​​​把名称赋值为2中的拼接了的名称​​concat(res.name, ad2.name)​


标签:parent,division,ad2,name,递归,sn,mysql,administrative,recursive
From: https://blog.51cto.com/u_15344989/6037078

相关文章

  • java实现oracle和mysql的group by分组功能|同时具备max()/min()/sum()/case when 函数
    一、前言oracle和mysql的groupby分组功能大家应该清楚,那如何使用java实现同样的功能呢比如下面这个表idnameagemathEnglish10yujianlin2092.5103ww841025201026110363103......
  • MySql 误操作回滚方法总结
    drop是直接删除表信息,速度最快,但是无法找回数据 truncatetabletruncate是删除表数据,不删除表的结构,速度排第二,但不能与where一起使用 deletefromdelete是删......
  • 04.二叉树的最大深度 (优先掌握递归)111.二叉树的最小深度 (优先掌握递归) 222.完全二叉树
    04.二叉树的最大深度/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode()......
  • MySQL 三个经典的问题
    前言今天给大家上3个经典的MySQL问题,希望能对大家有帮助!但是因为笔者计算机水平有限,可能会存在一些错误,烦请指出、斧正!谢谢!在MySQL中INNERJOIN、LEFTJOIN、RIGHTJOIN和......
  • MySQL之主从复制集群搭建
    简述这篇文章主要记录使用​​dockercompose​​​搭建​​MySQL​​主从复制集群搭建,方便后续进行本地测试开发。这篇文章主要介绍一主一从的搭建过程。主从架构,可以缓解M......
  • Mysql 中的日期时间函数汇总
    日期和时间函数MySQL中内置了大量的日期和时间函数,能够灵活、方便地处理日期和时间数据,本节就简单介绍一下MySQL中内置的日期和时间函数。1CURDATE()函数CURDATE()函数用......
  • linux中mysql安装
    #首先通过yum下载wget命令1.yum-yinstallwget#通过wget下载MySQL存储库2.wgethttps://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm3.rpm-Uvhmy......
  • mysql-数据备份
    1、准备一个mysql数据库1、查看mysql数据库可以看到此时mysql中没有测试数据库bkdatabase。]#/usr/local/mysql-5.7.28-el7-x86_64/bin/mysql-uroot-pmysql>sho......
  • Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig c
    使用SpringDataJPA访问数据时出现该错误,具体报错信息如下:ErrorstartingApplicationContext.Todisplaytheconditionsreportre-runyourapplicationwith'debug......
  • 递归-分治
    递归递归,将问题分解为重叠的子问题,f(n)=f(n-1)+xxx,满足这样的状态转移方程,说明原问题是不是依赖递归子问题,即f(n)依赖f(n-1)确定递归出口递归返回时还原现场78.子......