mysql 在同一个表中根据某个值返回树状结构
时间: 2024-02-12 17:08:53 浏览: 31
如果你在 MySQL 中有一个包含父子关系的表,你可以使用递归查询来返回树状结构。可以使用 WITH RECURSIVE 语句来实现递归查询。
以下是一个示例,假设我们有一个表 `departments`,其中包含 `id`,`name` 和 `parent_id` 这三个字段,`parent_id` 表示父部门的 `id`。
```
CREATE TABLE departments (
id INT PRIMARY KEY,
name VARCHAR(50),
parent_id INT
);
INSERT INTO departments VALUES (1, 'IT', NULL);
INSERT INTO departments VALUES (2, 'Development', 1);
INSERT INTO departments VALUES (3, 'Marketing', NULL);
INSERT INTO departments VALUES (4, 'Sales', 3);
INSERT INTO departments VALUES (5, 'Design', 2);
INSERT INTO departments VALUES (6, 'Testing', 2);
INSERT INTO departments VALUES (7, 'Training', 1);
INSERT INTO departments VALUES (8, 'HR', NULL);
INSERT INTO departments VALUES (9, 'Recruitment', 8);
INSERT INTO departments VALUES (10, 'Payroll', 8);
```
现在,如果我们想要按照树的形式返回部门信息,可以使用以下查询:
```
WITH RECURSIVE dept_tree AS (
SELECT id, name, parent_id, 0 AS level
FROM departments WHERE parent_id IS NULL
UNION ALL
SELECT d.id, d.name, d.parent_id, dt.level + 1
FROM departments d
JOIN dept_tree dt ON d.parent_id = dt.id
)
SELECT id, name, parent_id, level
FROM dept_tree
ORDER BY level, id;
```
该查询会返回以下结果:
```
id name parent_id level
------------------------------------
1 IT NULL 0
3 Marketing NULL 0
8 HR NULL 0
2 Development 1 1
7 Training 1 1
5 Design 2 2
6 Testing 2 2
4 Sales 3 1
9 Recruitment 8 1
10 Payroll 8 1
```
该查询使用了递归查询,首先从根节点开始(即 `parent_id` 为 `NULL` 的节点),然后逐级向下查询子节点。`dept_tree` 是一个递归的公共表表达式,它包含了每个节点的 `id`,`name`,`parent_id` 和 `level`。最后,我们根据 `level` 和 `id` 进行排序,以便可以按正确的顺序显示节点。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)