2017-05-31 1 views
2

Ich habe eine Ebene Hierarchie Tabellastruktur mit Adjazenzliste Modell. Es könnte wie folgt zusammengefasst werden:MySQL wählen Eltern gefolgt von seinen Kindern und bestellt von

id parent_id  title   created_at 

1  null   name1   2017-05-30 08:05:00 
2  null   name2   2017-05-30 08:15:00 
3  1    another name 2017-05-30 09:00:00 
4  1    new name  2017-05-30 08:06:00 
5  2    new title  2017-05-30 08:18:04 
6  null   lorem   2017-05-30 08:04:00 

Was muss ich bekommen ist eine SQL-Abfrage, die jede Zeile von null parent_id dh die Eltern durch ihre Kinder bestellt von created_at So etwas wie die folgenden gefolgt zurück:

id parent_id  title   created_at 

6  null   lorem   2017-05-30 08:04:00 
1  null   name1   2017-05-30 08:05:00 
4  1    new name  2017-05-30 08:06:00 
3  1    another name 2017-05-30 09:00:00 
2  null   name2   2017-05-30 08:15:00 
5  2    new title  2017-05-30 08:18:04 

ich habe

versucht
SELECT COALESCE(`parent_id`, `id`) as pid, title, created_at 
FROM `items` 
ORDER BY created_at 

Aber es der another name Datensatz separat am Ende t nicht gelungen ist gekommen Das Ergebnis ist festgelegt.

Dies ist sql fiddle for the case

Hinweis Im realen Fall die ID ein UUID-String ist.

Antwort

2

Wie über diese kleine Variation auf Ihre Arbeit:

SELECT id, parent_id, title, created_at 
FROM `items` 
ORDER BY COALESCE(`parent_id`, `id`), created_at 

In dieser Geige: http://sqlfiddle.com/#!9/d3dd87/10

Überarbeitete Eltern durch Zeitstempel, um zu bestellen und Kinder innerhalb der Eltern nach Zeitstempel:

SELECT id 
    , parent_id 
    , title 
    , created_at 
    , COALESCE((SELECT created_at FROM items as parent WHERE parent.id = items.parent_id),created_at) parent_created_at 
    FROM items 
ORDER 
    BY parent_created_at 
    , created_at 

Neue Geige: http://sqlfiddle.com/#!9/d3dd87/18

+0

Es wird als nächstes zu arbeiten, wie ich brauche, aber es gibt nicht die Reihe von 'id' =' 6 'zunächst trotz seiner Datetime ist der erste. – SaidbakR

+0

Also, um Ihre Frage zu klären, wollen Sie das Ergebnis von 'created_at' für die Eltern, aber die Kinder nach ihrem Eltern in' created_at' Reihenfolge kommen? – Turophile

+0

Ja es ist, wie Sie dachten, Eltern von created_at bestellt und jeder Elternteil wird gefolgt von seinen Kindern auch bestellt von created_at – SaidbakR

0

Ich denke, dass Sie wollen:

SELECT COALESCE(`parent_id`, `id`) as pid, title, created_at 
FROM `items` 
ORDER BY COALESCE(`parent_id`, `id`), created_at 
Verwandte Themen