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)即可):
| id | parent_ids |
|---|---|
| A | NULL |
| B | A |
| C | A,B |
| J | K |
| K | NULL |
| Y | K,J |
4. 逻辑简单说明
- 锚点成员:先定位所有根节点,它们没有父节点,所以
parent_ids设为NULL。 - 递归成员:通过自连接关联父节点已拼接好的路径,用
CONCAT_WS函数安全拼接(自动处理NULL值,避免多余逗号),逐层构建每个节点的完整父路径。
内容的提问来源于stack exchange,提问作者aclowkay
相关产品推荐
相关产品推荐

