mysql查询树形结构数据(mysql查询树状结构)

## MySQL 查询树形结构数据### 简介在关系型数据库中,经常需要存储和查询树形结构数据,例如:组织架构、商品分类、评论回复等。MySQL 并没有直接提供树形结构的存储类型,通常使用

邻接表

路径枚举

等方式来表示树形结构,并使用递归查询或其他技巧进行查询。### 1. 邻接表模型#### 1.1 模型介绍邻接表模型是最简单直观的树形结构存储方式,每个节点存储自身的 id 和父节点的 id (parent_id),根节点的 parent_id 通常为 NULL 或 0。#### 1.2 表结构示例```sql CREATE TABLE category (id INT PRIMARY KEY,name VARCHAR(255),parent_id INT,FOREIGN KEY (parent_id) REFERENCES category(id) ); ```#### 1.3 查询方式

查询指定节点的所有子节点:

可以使用递归查询 (Common Table Expression - CTE) 进行查询。```sql WITH RECURSIVE category_tree AS (SELECT id, name, parent_idFROM categoryWHERE id = 2 -- 指定节点idUNION ALLSELECT c.id, c.name, c.parent_idFROM category cJOIN category_tree ct ON c.parent_id = ct.id ) SELECT

FROM category_tree; ```

查询指定节点的所有父节点:

同样可以使用递归查询,不过需要反向查找父节点。```sql WITH RECURSIVE category_path AS (SELECT id, name, parent_idFROM categoryWHERE id = 5 -- 指定节点idUNION ALLSELECT c.id, c.name, c.parent_idFROM category cJOIN category_path cp ON c.id = cp.parent_id ) SELECT

FROM category_path; ```#### 1.4 优缺点

优点:

简单直观,易于理解和实现。

插入和删除节点操作效率较高。

缺点:

递归查询效率较低,尤其对于层级较深的树。

查询指定节点的所有子节点需要遍历整棵树。### 2. 路径枚举模型#### 2.1 模型介绍路径枚举模型为每个节点存储一个路径字符串,该字符串记录了从根节点到该节点的路径信息,通常使用分隔符 (例如 "/") 分隔路径中的节点 id。#### 2.2 表结构示例```sql CREATE TABLE category (id INT PRIMARY KEY,name VARCHAR(255),path VARCHAR(255) ); ```数据示例:| id | name | path | | -- | ------ | --------- | | 1 | Root | /1/ | | 2 | 电器 | /1/2/ | | 3 | 手机 | /1/2/3/ | | 4 | 电脑 | /1/2/4/ | | 5 | 服装 | /1/5/ |#### 2.3 查询方式

查询指定节点的所有子节点:

使用 `LIKE` 模糊查询即可。```sql SELECT

FROM category WHERE path LIKE '/1/2/%'; -- 查询id为2的节点的所有子节点 ```

查询指定节点的所有父节点:

使用字符串函数截取路径字符串。```sql SELECT

FROM category WHERE SUBSTRING_INDEX('/1/2/3/', '/', 2) = path; -- 查询id为3的节点的所有父节点 ```#### 2.4 优缺点

优点:

查询效率高,不需要递归查询。

可以方便地查询指定节点的所有子节点和父节点。

缺点:

路径字符串存储空间占用较大,尤其对于层级较深的树。

插入和删除节点操作需要更新所有子节点的路径字符串,效率较低。### 3. 总结选择哪种模型取决于具体的业务场景和需求。如果树的层级较浅,且插入和删除操作频繁,可以选择邻接表模型;如果树的层级较深,且查询操作频繁,可以选择路径枚举模型。此外,还可以结合其他技术,例如:嵌套集模型、闭包表模型等来优化树形结构数据的存储和查询效率。

MySQL 查询树形结构数据

简介在关系型数据库中,经常需要存储和查询树形结构数据,例如:组织架构、商品分类、评论回复等。MySQL 并没有直接提供树形结构的存储类型,通常使用 **邻接表** 或 **路径枚举** 等方式来表示树形结构,并使用递归查询或其他技巧进行查询。

1. 邻接表模型

1.1 模型介绍邻接表模型是最简单直观的树形结构存储方式,每个节点存储自身的 id 和父节点的 id (parent_id),根节点的 parent_id 通常为 NULL 或 0。

1.2 表结构示例```sql CREATE TABLE category (id INT PRIMARY KEY,name VARCHAR(255),parent_id INT,FOREIGN KEY (parent_id) REFERENCES category(id) ); ```

1.3 查询方式* **查询指定节点的所有子节点:** 可以使用递归查询 (Common Table Expression - CTE) 进行查询。```sql WITH RECURSIVE category_tree AS (SELECT id, name, parent_idFROM categoryWHERE id = 2 -- 指定节点idUNION ALLSELECT c.id, c.name, c.parent_idFROM category cJOIN category_tree ct ON c.parent_id = ct.id ) SELECT * FROM category_tree; ```* **查询指定节点的所有父节点:** 同样可以使用递归查询,不过需要反向查找父节点。```sql WITH RECURSIVE category_path AS (SELECT id, name, parent_idFROM categoryWHERE id = 5 -- 指定节点idUNION ALLSELECT c.id, c.name, c.parent_idFROM category cJOIN category_path cp ON c.id = cp.parent_id ) SELECT * FROM category_path; ```

1.4 优缺点**优点:*** 简单直观,易于理解和实现。 * 插入和删除节点操作效率较高。**缺点:*** 递归查询效率较低,尤其对于层级较深的树。 * 查询指定节点的所有子节点需要遍历整棵树。

2. 路径枚举模型

2.1 模型介绍路径枚举模型为每个节点存储一个路径字符串,该字符串记录了从根节点到该节点的路径信息,通常使用分隔符 (例如 "/") 分隔路径中的节点 id。

2.2 表结构示例```sql CREATE TABLE category (id INT PRIMARY KEY,name VARCHAR(255),path VARCHAR(255) ); ```数据示例:| id | name | path | | -- | ------ | --------- | | 1 | Root | /1/ | | 2 | 电器 | /1/2/ | | 3 | 手机 | /1/2/3/ | | 4 | 电脑 | /1/2/4/ | | 5 | 服装 | /1/5/ |

2.3 查询方式* **查询指定节点的所有子节点:** 使用 `LIKE` 模糊查询即可。```sql SELECT * FROM category WHERE path LIKE '/1/2/%'; -- 查询id为2的节点的所有子节点 ```* **查询指定节点的所有父节点:** 使用字符串函数截取路径字符串。```sql SELECT * FROM category WHERE SUBSTRING_INDEX('/1/2/3/', '/', 2) = path; -- 查询id为3的节点的所有父节点 ```

2.4 优缺点**优点:*** 查询效率高,不需要递归查询。 * 可以方便地查询指定节点的所有子节点和父节点。**缺点:*** 路径字符串存储空间占用较大,尤其对于层级较深的树。 * 插入和删除节点操作需要更新所有子节点的路径字符串,效率较低。

3. 总结选择哪种模型取决于具体的业务场景和需求。如果树的层级较浅,且插入和删除操作频繁,可以选择邻接表模型;如果树的层级较深,且查询操作频繁,可以选择路径枚举模型。此外,还可以结合其他技术,例如:嵌套集模型、闭包表模型等来优化树形结构数据的存储和查询效率。

标签列表