获取MySQL

时间:2016-11-19 16:49:41

标签: mysql sql stored-procedures hierarchical-data

我有一个相当简单的自引用表,如下所示:

表1

id      parent_id
1       NULL
2       1
3       NULL
4       1
5       2
6       5
7       2
8       4

我需要生成一个新表,其中对于每个元素,它们的所有后代都是相关联的。见这个例子:

表2

element  descendants
1        2
1        5
1        6
1        7
1        4
1        8
2        5
2        6
2        7
5        6
4        8

请注意3不存在,因为它没有任何子项。

如何使用存储过程实现此目的?我可以得到一个直接的亲子关系,但是我很难获得给定元素的所有后代。

(真实世界表是~15k行& ~7级层次结构,但是它没有预定义等级,所以假设是N)

1 个答案:

答案 0 :(得分:1)

这可以通过递归CTE完成。 MySQL现在支持递归CTE,如MySQL Server Blog

中所述

假设一个名为“self_ref”的表,递归CTE将类似于:

with recursive ref(element, descendant) as (
select parent_id, id from self_ref
union 
select element, id
from ref as r
    inner join self_ref as s on s.parent_id = r.descendant
where parent_id is not null
)
select element, descendant from ref
where element is not null
order by element, descendant;

(这是为Postgres编写的,但如果不相同,MySQL语法也类似。)