我有一个具有层次结构的表:
_________
|Plans |_____________________________________________
|-------------------------------------------------------|
| id | parent | plan_name | description |
|-------------------------------------------------------|
| 1 0 Painting bla..bla |
| 2 1 Shopping bla..bla |
| 3 1 Scheduling bla..bla |
| 4 2 Costumes bla..bla |
| 5 2 Tools bla..bla |
| 6 2 Paints bla..bla |
|_______________________________________________________|
我想列出计划名称Paints
的所有父母,因此我可以构建一个面包屑来导航回来。使用id = 6
我想得到:
Painting > Shopping > Paints
我正在使用带有PHP的postgresql,并考虑尽可能简单地获取所有父项的有效方法。
答案 0 :(得分:2)
with recursive pl(id, parent, parents) as (
select id, parent, array[parent]
from plans
union
select pl.id, plans.parent, pl.parents|| plans.parent
from pl
join plans on pl.parent = plans.id
)
select distinct on (id) id, parents
from pl
order by id, array_length(parents, 1) desc
id | parents
----+---------
1 | {0}
2 | {1,0}
3 | {1,0}
4 | {2,1,0}
5 | {2,1,0}
6 | {2,1,0}
(6 rows)
您可以使用文本列聚合计划名称,而不是父ID的整数数组:
with recursive pl(id, parent, parents, depth) as (
select id, parent, plan_name, 0
from plans
union
select pl.id, plans.parent, plans.plan_name|| ' > ' ||pl.parents, depth+ 1
from pl
join plans on pl.parent = plans.id
)
select distinct on (id) id, parents
from pl
order by id, depth desc;
id | parents
----+--------------------------------
1 | Painting
2 | Painting > Shopping
3 | Painting > Scheduling
4 | Painting > Shopping > Costumes
5 | Painting > Shopping > Tools
6 | Painting > Shopping > Paints
(6 rows)