MySql8 WITH RECURSIVE递归查询父子集的方法

当我们需要查询数据中某个节点的所有子节点或父节点时,使用递归查询是一种非常方便的解决方案。MySQL 8 提供了一个WITH RECURSIVE语法来实现递归查询。下面是递归查询父子集的完整攻略:

1. 建立测试数据库

为了演示示例,我们需要先建立一个测试数据库,并在该数据库中建立一个包含parent_id字段的表。

CREATE DATABASE test;
USE test;

CREATE TABLE nodes(
id INT PRIMARY KEY,
name VARCHAR(20),
parent_id INT DEFAULT NULL
);

INSERT INTO nodes(id, name, parent_id) VALUES(1, 'Node-1', NULL);
INSERT INTO nodes(id, name, parent_id) VALUES(2, 'Node-1-1', 1);
INSERT INTO nodes(id, name, parent_id) VALUES(3, 'Node-1-2', 1);
INSERT INTO nodes(id, name, parent_id) VALUES(4, 'Node-1-1-1', 2);
INSERT INTO nodes(id, name, parent_id) VALUES(5, 'Node-1-1-2', 2);
INSERT INTO nodes(id, name, parent_id) VALUES(6, 'Node-1-2-1', 3);
INSERT INTO nodes(id, name, parent_id) VALUES(7, 'Node-1-2-2', 3);

以上代码建立了一个名为test的数据库,并在该数据库中建立了一个名为nodes的表。表中包含id、name、parent_id三个字段。其中parent_id字段用来存储节点的父节点id。数据如下:

id name parent_id
1 Node-1 NULL
2 Node-1-1 1
3 Node-1-2 1
4 Node-1-1-1 2
5 Node-1-1-2 2
6 Node-1-2-1 3
7 Node-1-2-2 3

2. 查询子节点集

我们现在需要查询id=2的节点的所有子节点。以下是使用递归查询查询子节点集的示例代码:

WITH RECURSIVE cte AS (
SELECT id, name, parent_id FROM nodes WHERE id = 2
UNION ALL
SELECT n.id, n.name, n.parent_id FROM nodes n JOIN cte ON cte.id = n.parent_id
)
SELECT * FROM cte;

以上代码中,我们创建了一个CTE(公共表表达式) cte。该CTE包含两个部分,第一个部分是查询id=2的节点信息,第二个部分使用JOIN语法连接nodes表和cte表,实现递归查询。执行以上查询后,我们可以得到以下结果:

id name parent_id
2 Node-1-1 1
4 Node-1-1-1 2
5 Node-1-1-2 2

结果包含了id=2节点的所有子节点的信息。可以看出,递归查询的核心语法就是UNION ALL和JOIN语句的结合使用。

3. 查询父节点集

我们现在需要查询id=4的节点的所有父节点。以下是使用递归查询查询父节点集的示例代码:

WITH RECURSIVE cte AS (
SELECT id, name, parent_id FROM nodes WHERE id = 4
UNION ALL
SELECT n.id, n.name, n.parent_id FROM nodes n JOIN cte ON n.id = cte.parent_id
)
SELECT * FROM cte;

以上代码中,我们创建了一个CTE cte。该CTE包含两个部分,第一个部分是查询id=4的节点信息,第二个部分使用JOIN语法连接nodes表和cte表,实现递归查询。执行以上查询后,我们可以得到以下结果:

id name parent_id
4 Node-1-1-1 2
2 Node-1-1 1
1 Node-1 NULL

可以看出,递归查询父子节点的方法和查询子节点是类似的,需要切换CTE中查询的基础表(即使用JOIN语法的表)和使用JOIN语法的表的连接方式。

通过本文的讲解,相信您已经掌握了MySQL 8使用WITH RECURSIVE递归查询父子集的方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySql8 WITH RECURSIVE递归查询父子集的方法 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • centos编译安装mariadb的详细过程

    下面就为您详细讲解CentOS编译安装MariaDB的完整攻略,步骤如下: 安装编译依赖 在编译MariaDB之前,我们需要先安装一些编译依赖,可以使用yum命令进行安装: yum install -y wget gcc gcc-c++ ncurses-devel perl-Data-Dumper perl-Test-Harness 下载并解压MariaDB…

    database 2023年5月18日
    00
  • 详解关于MySQL 8.0走过的坑

    详解关于MySQL 8.0走过的坑 在使用MySQL 8.0过程中,我们发现了一些常见的问题和坑点。以下将详细讲解并给出解决方案。 坑点1:默认密码认证方式改变 MySQL 8.0的默认密码认证方式改为了caching_sha2_password,而旧版MySQL默认认证方式是mysql_native_password。这就导致了一些连接旧版本MySQL的客…

    database 2023年5月18日
    00
  • 关于Redis的工作模式

    在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master。 缺点:哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内…

    Redis 2023年4月13日
    00
  • Ubuntu Server下MySql数据库备份脚本代码

    下面是Ubuntu Server下MySql数据库备份脚本代码的完整攻略。 环境准备 在开始编写MySql数据库备份脚本之前,需要确保在Ubuntu Server系统中已经安装了MySql数据库,并且安装了mysqldump命令。此外,还需要创建一个备份目录来存储备份文件,可以使用以下命令创建: sudo mkdir /backup sudo chown -…

    database 2023年5月22日
    00
  • MySQL中联表更新与删除的语法介绍

    MySQL中联表更新与删除是指在MySQL数据库中,使用多表查询的方式进行数据的更新和删除操作。下面我将详细介绍MySQL中联表更新与删除的语法。 联表更新语法 UPDATE 表1 JOIN 表2 ON 表1.字段名=表2.字段名 SET 表1.字段名=新值 WHERE 条件; 在上面的语法中,UPDATE关键字指定要更新数据的表,JOIN关键字指定要加入的…

    database 2023年5月22日
    00
  • MySQL ALTER命令知识点汇总

    MySQL ALTER命令知识点汇总 什么是ALTER命令 ALTER命令是MySQL用来修改已有的表结构的命令。使用ALTER命令可以修改表名,增加、删除列,修改列的数据类型或属性,以及修改表级约束等。 常见的ALTER命令语法 修改表名 ALTER TABLE table_name RENAME TO new_table_name; 添加新列 ALTER…

    database 2023年5月22日
    00
  • mysql查询学生表里面成绩第2名的学生成绩

    如图:    多表关联写法:    

    MySQL 2023年4月13日
    00
  • SQL 2005使用专用管理员连接(DAC)的技巧及修改系统表的方法

    SQL 2005使用专用管理员连接(DAC)的技巧及修改系统表的方法 在 SQL Server 2005 中,有一种特殊的连接方式叫做“专用管理员连接(Dedicated Administrator Connection, DAC)”,它可以让管理员在无法通过普通连接方式访问数据库服务器时,通过单独的连接方式登录到一个可控制的会话中,在该会话中执行管理任务。…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部