MYSQL递归:
-- 表结构创建 包括主键id,组织名称,父id
CREATE TABLE categories (
id INT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES categories(id)
);
插入测试数据:
INSERT INTO `categories`(`id`, `name`, `parent_id`) VALUES (1, '公司', NULL);
INSERT INTO `categories`(`id`, `name`, `parent_id`) VALUES (2, '技术中心', 1);
INSERT INTO `categories`(`id`, `name`, `parent_id`) VALUES (3, '研发部', 2);
INSERT INTO `categories`(`id`, `name`, `parent_id`) VALUES (4, '测试部', 2);
INSERT INTO `categories`(`id`, `name`, `parent_id`) VALUES (5, '产品部', 2);
示例:通过递归的方式查询技术中心下的子部门
WITH RECURSIVE temp_tree(id,name,parent_id,depth) AS (
SELECT id,name,parent_id,0 as depth
FROM categories
WHERE id = '1'
UNION ALL
SELECT c.id,c.name,c.parent_id,t.depth + 1
FROM categories c JOIN temp_tree t ON c.parent_id = t.id
)
SELECT * FROM temp_tree
1、WITH RECURSIVE: MYSQL递归执行语法,temp_tree:为临时表括号中字段为最终查询出的字段;
2、递归主要包括初始部分和递归部分:
(1)初始部分是union all上的select查询,查询的为id为1的初始数据
ID | NAME | PARENT_ID | DEPTH |
---|---|---|---|
1 | 公司 | 0 |
(2)递归部分是是union all下的select查询,连接临时表递归查询数据
最终查询结果如下: