Einfaches Abrufen aller Eltern mit PostgreSQL

Ich habe eine Tabelle mit einer hierarchischen Struktur:

_________ |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 | |_______________________________________________________| 

Ich möchte alle Eltern des Plannamen Paints , damit ich einen Breadcrumb erstellen kann, um zurück zu navigieren. Mit id = 6 bekomme ich gerne:

 Painting > Shopping > Paints 

Ich benutze PostgreSQL mit PHP und denke über eine effiziente Möglichkeit, alle Eltern so einfach wie möglich zu holen.

Solutions Collecting From Web of "Einfaches Abrufen aller Eltern mit PostgreSQL"

Verwenden Sie rekursiv mit Abfrage :

 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) 

SQLFiddle

Anstelle eines Integer-Arrays mit Parent-IDs können Sie eine Textspalte zum Aggregieren von Plannamen verwenden:

 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)