2017-11-01 2 views
2

I folgende Struktur haben:Spalten mit Hierarchie und zusätzliche Spalte Sortierung für die Sortierung

id, 
name, 
parent_id, 
order_by 

und Einträge:

id | name | parent_id | order_by 
----+-----------+-----------+---------- 
    8 | Cat 1  |   |  1 
    7 | Cat 2  |   |  2 
    5 | Cat 3  |   |  3 
15 | Cat 1.1 |   8 |  1 
17 | Cat 1.2 |  15 |  2 
16 | Cat 2.1 |   8 |  1 
20 | Cat 1.2.1 |  17 |  1 

Und ich will Ausgabe:

id | name | parent_id | order_by 
----+-----------+-----------+---------- 
    8 | Cat 1  |   |  1 
15 | Cat 1.1 |   8 |  1 
17 | Cat 1.2 |   8 |  2 
20 | Cat 1.2.1 |  17 |  1 
    7 | Cat 2  |   |  2 
16 | Cat 2.1 |   7 |  1 
    5 | Cat 3  |   |  3 

So sortieren Haupteinträge (ohne parent_id) mit order_by Spalte und sortieren in Kinder mit order_by Spalte für chil dren auf einer Ebene.

+1

Es scheint ein Fehler in der Eingabedaten, die Sie zur Verfügung gestellt haben - in der ersten Tabelle der parent_id von Cat1.2 15 ist und in der zweiten ist es 8. Das gleiche gilt für Cat2.1 - in der ersten Tabelle ist es 8, in der zweiten ist es 7. – mishless

Antwort

2

Anmerkung: Ich gehe davon aus, dass die für id 16 = die parent_id sein sollte, nicht 8


Sie benötigen eine rekursive Abfrage durch den ganzen Baum zu gehen. Sie benötigen einen Weg, um die Hauptsortierreihenfolge zu „erinnern“ und dann sortieren nach zwei verschiedenen Kriterien: eine für die „overall“ Sortierreihenfolge und eine für jedes Kind Ebene:

with recursive tree as (
    select id, name, parent_id, order_by as main_order, null::int as child_order 
    from category 
    where parent_id is null 
    union all 
    select c.id, c.name, c.parent_id, p.main_order, c.order_by as child_order 
    from category c 
    join tree p on p.id = c.parent_id 
) 
select * 
from tree 
order by main_order, child_order nulls first; 

Durch die order_by von der Root-Ebene trägt Für alle Kinder können wir alle Zeilen, die zur selben Wurzel gehören, zusammenhalten. Die Zeilen für eine Wurzel werden dann nach der falschen child_order sortiert - die Stammzeilen haben null für diese Spalte und die nulls first setzt sie am Anfang jeder Gruppe.


Online Beispiel: http://rextester.com/ZVLII98217

+0

Genau das möchte ich archivieren! Netter Trick mit der 'child_order' Spalte. Vielen Dank. –

Verwandte Themen