mysql 8.0 引入了 cte(公共表表达式),使用 with 关键字定义,支持递归查询无限层级树。核心做法是编写一个包含初始查询和递归查询的 with recursive 块,通过 union all 连接两部分,利用临时结果集逐层展开子节点,直到没有新数据产生为止。

CTE 的基本语法结构是怎样的
CTE 的基本结构由名称、可选列名列表以及定义查询组成。它允许将复杂查询分解为更简单的逻辑单元,提高可读性。在 MySQL 中,CTE 的作用域仅限于当前语句,可以是 SELECT、INSERT、UPDATE 或 DELETE。

安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
CREATE TABLE tree_nodes (
id INT PRIMARY KEY,
parent_id INT,
name VARCHAR(50)
);
INSERT INTO tree_nodes VALUES
(1, NULL, 'Root'),
(2, 1, 'Child 1'),
(3, 1, 'Child 2'),
(4, 2, 'Grandchild 1');
如何编写递归查询以遍历无限层级树
递归 CTE 必须包含两个部分:锚点成员(Anchor Member)和递归成员(Recursive Member)。锚点成员返回树的根节点,递归成员则基于上一轮的结果查找子节点,直到没有更多子节点为止。使用 UNION ALL 确保性能并避免循环依赖导致的错误。
WITH RECURSIVE TreeCTE AS (
-- Anchor Member: Select root nodes
SELECT id, parent_id, name, 1 AS level
FROM tree_nodes
WHERE parent_id IS NULL
UNION ALL
-- Recursive Member: Join with CTE to find children
SELECT t.id, t.parent_id, t.name, tc.level + 1
FROM tree_nodes t
INNER JOIN TreeCTE tc ON t.parent_id = tc.id
)
SELECT * FROM TreeCTE ORDER BY level;
递归深度超过限制时会发生什么
如果递归深度超过 MySQL 配置的 cte_max_recursion_depth 默认值(通常为 1000),查询会报错。可以通过设置会话变量或全局变量来调整此限制,但需注意防止无限循环导致资源耗尽。建议在递归查询中加入适当的终止条件或检查逻辑。










