Zitat:
Zitat von MyFrosch Hallo,
ich habe eine Tabelle mit Einträgen.
id | parent_id (standart = NULL) | time | text
Zur Zeit lese ich alle Einträge mit parent_id = NULL aus. Dann nehme ich mir von allen Einträgen die ID. Und tue diese IDs in eine neue Abfrage mit IN(1,5,34,...). Nur das ich hier zu jedem Eintrag alle Untergeordneten Einträge bekomme. Mit GROUP BY bekomme ich nur den Letzten. Ich möchte aber die letzten 2 haben.
Oder gibt es sogar eine Möglichkeit die das alles ein einer Abfrage macht?
Vielen Dank
Philipp |
Mit rekursiven Abfragen kann man jede Menge machen...
Code:
test=*# select * from frosch ;
id | parent_id | t
----+-----------+---
1 | | a
2 | 1 | b
3 | 2 | c
4 | 3 | d
5 | 4 | e
6 | | f
7 | 6 | g
8 | 7 | h
9 | 8 | i
(9 rows)
Time: 0,274 ms
test=*# with recursive r as (select id, parent_id, t, 0::int as c from frosch where parent_id is null and id=1 union all select f.id, f.parent_id, r.t || f.t, c+1 from frosch f inner join r on (f.parent_id=r.id)) select * from r;
id | parent_id | t | c
----+-----------+-------+---
1 | | a | 0
2 | 1 | ab | 1
3 | 2 | abc | 2
4 | 3 | abcd | 3
5 | 4 | abcde | 4
(5 rows)
test=*# with recursive r as (select id, parent_id, t, 0::int as c from frosch where parent_id is null union all select f.id, f.parent_id, r.t || f.t, c+1 from frosch f inner join r on (f.parent_id=r.id)) select * from r order by id;
id | parent_id | t | c
----+-----------+-------+---
1 | | a | 0
2 | 1 | ab | 1
3 | 2 | abc | 2
4 | 3 | abcd | 3
5 | 4 | abcde | 4
6 | | f | 0
7 | 6 | fg | 1
8 | 7 | fgh | 2
9 | 8 | fghi | 3
(9 rows)
Die Spalte c ist die Tiefe der Rekursion, wenn Du alle der Tiefe 2 haben willst ist das auch kein Problem.
Andreas
Kann man beliebig weit treiben das Spiel ...
Andreas