mysql5.7 递归查询
时间: 2023-09-09 12:10:22 浏览: 125
MySQL递归查询
MySQL 5.7 支持递归查询,可以使用 WITH RECURSIVE 语句来实现。
WITH RECURSIVE 语句的基本语法如下:
```
WITH RECURSIVE cte_name (column_name_list) AS (
initial_query
UNION [ALL]
recursive_query
)
SELECT *
FROM cte_name;
```
其中,cte_name 是递归查询的结果集名称,initial_query 是递归查询的初始查询语句,recursive_query 是递归查询的递归查询语句,column_name_list 是结果集列名称列表。
递归查询分为两个部分:初始查询和递归查询。初始查询是递归查询的起点,递归查询是递归查询的重点。在递归查询中,使用 UNION ALL 操作符将递归查询结果与初始查询结果合并。
下面是一个简单的示例,演示如何使用递归查询从一个表中查询所有的子孙节点:
```
CREATE TABLE department (
id INT PRIMARY KEY,
name VARCHAR(100),
parent_id INT
);
INSERT INTO department VALUES (1, 'Sales', NULL);
INSERT INTO department VALUES (2, 'Marketing', NULL);
INSERT INTO department VALUES (3, 'Advertising', 2);
INSERT INTO department VALUES (4, 'Public Relations', 2);
INSERT INTO department VALUES (5, 'Direct Sales', 1);
INSERT INTO department VALUES (6, 'Channel Sales', 1);
INSERT INTO department VALUES (7, 'Online Advertising', 3);
INSERT INTO department VALUES (8, 'Print Advertising', 3);
INSERT INTO department VALUES (9, 'TV Advertising', 3);
WITH RECURSIVE department_tree AS (
SELECT id, name, parent_id, 0 AS level
FROM department
WHERE parent_id IS NULL
UNION ALL
SELECT d.id, d.name, d.parent_id, dt.level + 1
FROM department d
JOIN department_tree dt ON d.parent_id = dt.id
)
SELECT id, name, parent_id, level
FROM department_tree;
```
在上面的示例中,使用 WITH RECURSIVE 语句创建了一个名为 department_tree 的 CTE(通用表达式)。初始查询使用 WHERE parent_id IS NULL 条件从 department 表中选择根节点。递归查询使用 JOIN 操作符将 department 表中的子节点连接到 department_tree CTE 中,直到查询出所有的子孙节点。最后,从 department_tree CTE 中选择所有的节点。
阅读全文