MySQL树查询所有子节点

在数据库中,树结构是一种常见的数据结构,它可以用来表示层次关系或者分类关系。在某些情况下,我们需要查询一个节点下的所有子节点,以便进行相关的操作。本文将介绍如何使用MySQL来查询一个节点下的所有子节点,并提供相应的代码示例。

数据库表结构

首先,我们需要创建一个用于存储树结构的数据库表。假设我们要存储一个公司组织结构,其中每个节点包含一个唯一的ID和一个父节点的ID。我们可以使用以下的SQL语句创建一个名为organization的表:

CREATE TABLE organization (
  id INT PRIMARY KEY,
  parent_id INT,
  name VARCHAR(50)
);

这个表的结构非常简单,包含三个字段:id用于存储节点的唯一ID,parent_id用于存储父节点的ID,name用于存储节点的名称。

插入数据

接下来,我们需要向organization表中插入一些数据,以构建一棵组织树。假设我们有以下的数据:

id parent_id name
1 NULL 公司
2 1 人事部
3 1 财务部
4 2 人事一组
5 2 人事二组
6 3 财务一组
7 3 财务二组

我们可以使用以下的SQL语句将数据插入到organization表中:

INSERT INTO organization (id, parent_id, name) VALUES
  (1, NULL, '公司'),
  (2, 1, '人事部'),
  (3, 1, '财务部'),
  (4, 2, '人事一组'),
  (5, 2, '人事二组'),
  (6, 3, '财务一组'),
  (7, 3, '财务二组');

查询所有子节点

现在,我们已经完成了数据的准备工作,可以开始编写查询所有子节点的代码了。在MySQL中,我们可以使用递归的方式查询一个节点下的所有子节点。

WITH RECURSIVE subordinates AS (
  SELECT id, parent_id, name FROM organization WHERE id = ?
  UNION ALL
  SELECT o.id, o.parent_id, o.name FROM organization o
  JOIN subordinates s ON o.parent_id = s.id
)
SELECT * FROM subordinates;

上述代码将查询指定节点的所有子节点,并返回结果集。其中,?是要查询子节点的根节点的ID。

我们可以通过以下的SQL语句查询“人事部”节点下的所有子节点:

WITH RECURSIVE subordinates AS (
  SELECT id, parent_id, name FROM organization WHERE id = 2
  UNION ALL
  SELECT o.id, o.parent_id, o.name FROM organization o
  JOIN subordinates s ON o.parent_id = s.id
)
SELECT * FROM subordinates;

结果如下:

id parent_id name
2 1 人事部
4 2 人事一组
5 2 人事二组

由此可见,“人事部”节点下的子节点为“人事一组”和“人事二组”。

完整代码示例

下面是一个完整的代码示例,它演示了如何使用MySQL查询一个节点下的所有子节点:

-- 创建表
CREATE TABLE organization (
  id INT PRIMARY KEY,
  parent_id INT,
  name VARCHAR(50)
);

-- 插入数据
INSERT INTO organization (id, parent_id, name) VALUES
  (1, NULL, '公司'),
  (2, 1, '人事部'),
  (3, 1, '财务部'),
  (4, 2, '人事一组'),
  (5, 2, '人事二组'),
  (6, 3, '财务一组'),
  (7, 3, '财务二组');

-- 查询所有子节点
WITH RECURSIVE subordinates AS (
  SELECT id, parent_id