MySQL获取root的路径

时间:2018-04-26 12:46:18

标签: mysql

我有一张像

这样的表格
id      | parent_id
________|_________
'A'     | NULL
'B      | 'A'
'C'     | 'B'
'K'     | NULL
'J'     | 'K'
'Y'     | 'J'

我想以这样一种方式查询MySQL,即每个id都有一个完整的父路径。

id      | parent_ids
________|_________
'A'     | NULL
'B      | 'A'
'C'     | 'A','B'
'K'     | NULL
'J'     | 'K'
'Y'     | 'J','K'

1 个答案:

答案 0 :(得分:0)

不幸的是,MySQL 5没有递归查询。

但是如果你没有很多级别(例如4),你可以使用多个与UNION ALL连接的查询。我认为它比一个难以理解的硬查询更快更容易理解。

测试数据

create table products(
  id varchar(1),
  parent_id varchar(1)
);

insert products(id,parent_id)values
('A',NULL),
('B','A'),
('C','B'),
('K',NULL),
('J','K'),
('Y','J');

演示查询

SELECT l1.id,l1.parent_id,NULL parent_ids
FROM products l1
WHERE l1.parent_id IS NULL

UNION ALL

SELECT l2.id,l2.parent_id,l1.id
FROM products l1
JOIN products l2 ON l2.parent_id=l1.id
WHERE l1.parent_id IS NULL

UNION ALL

SELECT l3.id,l3.parent_id,concat(l1.id,',',l2.id)
FROM products l1
JOIN products l2 ON l2.parent_id=l1.id
JOIN products l3 ON l3.parent_id=l2.id
WHERE l1.parent_id IS NULL

UNION ALL

SELECT l3.id,l3.parent_id,concat(l1.id,',',l2.id,',',l3.id)
FROM products l1
JOIN products l2 ON l2.parent_id=l1.id
JOIN products l3 ON l3.parent_id=l2.id
JOIN products l4 ON l4.parent_id=l3.id
WHERE l1.parent_id IS NULL

SQL小提琴 - http://sqlfiddle.com/#!9/0b76f4/16