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

yizhihongxing

当我们需要查询数据中某个节点的所有子节点或父节点时,使用递归查询是一种非常方便的解决方案。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日

相关文章

  • 深入Oracle的left join中on和where的区别详解

    深入Oracle的Left Join中ON和WHERE的区别详解 当我们在使用Left Join连接两张表格时,我们可以在Join语句中使用ON或WHERE子句来对连接进行筛选。本文将详细讲解ON和WHERE两个子句的使用区别并提供示例代码。 ON子句 ON子句是在Join子句后面使用的,它用于指定连接两张表格时的条件。通过ON子句,我们可以在连接表格时确保…

    database 2023年5月21日
    00
  • Redis大key多key拆分实现方法解析

    Redis大key多key拆分实现方法解析 什么是Redis的大key? Redis中的key是用来标识唯一数据的名称。在Redis中,一个大key通常表示一个包含了大量相关数据的键值对的集合。如果大key很大,那么这个键值对会占用较多的内存和CPU资源,同时也会影响查询速度,导致Redis性能下降。 Redis大key的解决方案 我们可以将一个大的key拆…

    database 2023年5月22日
    00
  • 详解MySQL中数据类型和字段类型

    详解MySQL中数据类型和字段类型 在MySQL中,我们可以根据需要定义不同的数据类型和字段类型。掌握了这些知识,可以让我们更好地设计数据库表结构,提高数据的存储效率和查询效率。本文将详细讲解MySQL中的数据类型和字段类型,供大家参考。 MySQL数据类型 MySQL支持多种数据类型,包括整型、浮点型、日期型等,下面是一些常用的数据类型: 整型 TINYI…

    database 2023年5月22日
    00
  • 业务开发和销售的区别

    业务开发和销售的区别 业务开发和销售是企业中两个重要的职能部门,虽然它们都与商品或服务的交易有关系,但它们的角色和职责有着内在的差别。 业务开发 业务开发通常是指企业寻找并与新客户建立联系、发掘新的业务机会,为企业带来持续的利润增长。业务开发的工作聚焦于业务拓展和市场开拓,并直接与顾客进行沟通来确定他们的需求和痛点。 业务开发的主要任务有: 研究市场和行业,…

    database 2023年3月27日
    00
  • 全面了解mysql中utf8和utf8mb4的区别

    当我们在使用MySQL数据库的时候,经常会涉及到字符集的问题。在MySQL中,常用的字符集有UTF-8和UTF-8MB4两种,那么这两者之间有哪些区别呢? 一、UTF-8和UTF-8MB4的简单介绍 UTF-8和UTF-8MB4都是用来表示Unicode字符集的字符集,其中UTF-8是由1~4个字节编码组成的,而UTF-8MB4是由1~4个字节编码组成的超集…

    database 2023年5月22日
    00
  • SQL – 通配符

    下面是SQL通配符的详细讲解: SQL通配符 SQL通配符是一些特殊字符,用于模糊匹配字符串。在SQL中,常用的通配符有以下三种: % 表示匹配任意长度的字符(包括0个字符)。 _ 表示匹配单个字符,但是无法匹配空格。 [] 表示匹配括号中任意一个字符,例如[abc]表示匹配a、b、c中任意一个字符。 通配符可以用于SELECT、WHERE、LIKE、BET…

    database 2023年3月27日
    00
  • PostgreSQL使用MySQL外表的步骤详解(mysql_fdw)

    PostgreSQL使用MySQL外表的步骤详解(mysql_fdw) MySQL外表(fdw)允许PostgreSQL服务器访问远程MySQL服务器上的数据,就好像它们存在于PostgreSQL本地一样。这可以极大地简化数据集成,特别是在需要合并来自不同数据库的数据时。 下面是使用mysql_fdw的步骤以及具体操作: 步骤一:安装mysql_fdw 首先…

    database 2023年5月22日
    00
  • DBMS选择和投影的区别

    DBMS(Database Management System)选择和投影是关系型数据库中的两个基本操作。这两个操作的作用不同,本文将详细讲解它们之间的区别,并结合实例进行说明。 DBMS选择(SELECT) DBMS选择操作是从关系型数据库表中选取满足一定条件的行的操作。选择操作是SQL语言中最常用的操作之一。 选择语法 SELECT * FROM tab…

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