2012-11-14 6 views
10

Ich habe eine Tabelle wie:MySql: ORDER BY Eltern und Kind

+------+---------+- 
| id | parent | 
+------+---------+ 
| 2043 | NULL | 
| 2044 | 2043 | 
| 2045 | 2043 | 
| 2049 | 2043 | 
| 2047 | NULL | 
| 2048 | 2047 | 
| 2043 | 2047 | 
+------+---------+ 

, die eine einfache, 2-Ebene "Eltern-Kind" -corelation. Wie kann ich nach einer SELECT-Anweisung bestellen, um die Reihenfolge wie in der obigen Liste zu bekommen, was bedeutet: 1. Elternteil, Kind von 1. Elternteil, 2. Elternteil, Kind von 2. Elternteil usw. (wenn ich das habe, kann ich das hinzufügen ORDER BYs für die Kinder ... ich hoffe). Ist es möglich ohne ein Sortierfeld hinzuzufügen?

Antwort

43

einschließlich Sortierung Kinder von ID:

ORDER BY COALESCE(parent, id), parent IS NOT NULL, id 

SQL Fiddle example

Erläuterung:

  • COALESCE(parent, id): Sortierung (effektiv zusammen Gruppierung) die ID der Eltern.
  • parent IS NOT NULL: Legen Sie die übergeordnete Zeile auf der Oberseite der Gruppe
  • id: Schließlich sortiert alle Kinder (gleich Eltern und parent ist nicht null)
0

Wenn Ihre Tabelle verwendet 0 statt null, um anzuzeigen, ein Eintrag ohne Eltern:

id | parent 
------------- 
1233 | 0 
1234 | 1233 
1235 | 0 
1236 | 1233 
1237 | 1235 

Verwenden greatest statt coalesce und den Wert überprüfen, ist nicht gleich 0:

ORDER BY GREATEST(parent, id), parent != 0, id