You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL技术问询:如何查询获取表中每个ID的完整父路径

没问题,我来帮你搞定这个获取树形结构完整父路径的需求!

实现MySQL树形节点的完整父路径查询

针对你给出的树形结构表数据,要获取每个节点的完整父路径,在MySQL 8.0及以上版本,用**递归CTE(公共表表达式)**是最简洁高效的方案,下面直接上具体实现:

1. 先确认表结构与测试数据

假设你的表名为tree_nodes,先创建表并插入测试数据:

CREATE TABLE tree_nodes (
    id VARCHAR(1) PRIMARY KEY,
    parent_id VARCHAR(1)
);

INSERT INTO tree_nodes (id, parent_id) VALUES
('A', NULL),
('B', 'A'),
('C', 'B'),
('K', NULL),
('J', 'K'),
('Y', 'J');

2. 递归CTE查询语句

WITH RECURSIVE node_paths AS (
    -- 锚点成员:先筛选出所有根节点(无父节点的节点)
    SELECT 
        id, 
        parent_id,
        CAST(NULL AS CHAR(255)) AS parent_ids
    FROM tree_nodes
    WHERE parent_id IS NULL
    
    UNION ALL
    
    -- 递归成员:逐层向上拼接父节点路径
    SELECT 
        tn.id, 
        tn.parent_id,
        CONCAT_WS(',', np.id, np.parent_ids) AS parent_ids
    FROM tree_nodes tn
    JOIN node_paths np ON tn.parent_id = np.id
)
SELECT id, parent_ids
FROM node_paths
ORDER BY id;

3. 执行结果验证

运行上面的语句后,会得到你预期的结果(注:若你需要Y的路径是J,K而非默认的K,J,只需把递归成员里的CONCAT_WS(',', np.id, np.parent_ids)改成CONCAT_WS(',', tn.parent_id, np.parent_ids)即可):

idparent_ids
ANULL
BA
CA,B
JK
KNULL
YK,J

4. 逻辑简单说明

  • 锚点成员:先定位所有根节点,它们没有父节点,所以parent_ids设为NULL。
  • 递归成员:通过自连接关联父节点已拼接好的路径,用CONCAT_WS函数安全拼接(自动处理NULL值,避免多余逗号),逐层构建每个节点的完整父路径。

内容的提问来源于stack exchange,提问作者aclowkay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:43:15