2012-11-14 11 views
10

Mam tabeli jak:MySQL: ORDER BY rodzicem a dzieckiem

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

który pokazuje prosty, 2-poziomowego "rodzic-dziecko" -corelation. Jak mogę ZAMÓWIĆ PRZEZ SELECT-statement, aby otrzymać zamówienie jak na powyższej liście, co oznacza: pierwszy rodzic, dziecko pierwszego rodzica, drugiego rodzica, dziecko drugiego rodzica i tak dalej (jeśli mam to, mogę dodać ORDER BY dla dzieci ... Mam nadzieję). Czy możliwe jest dodanie pola sortowania?

Odpowiedz

43

tym sortowania dzieci przez ID:

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

SQL Fiddle example

wyjaśnienie:

  • COALESCE(parent, id): sortuj według (efektywnie grupowanie) id rodzica.
  • parent IS NOT NULL: Umieść wiersz nadrzędny na szczycie grupy
  • id: Wreszcie porządek wszystkich dzieci (tego samego rodzica, a parent nie jest null)
0

Jeśli tabela wykorzystuje 0 zamiast null wskazać wpis bez rodziców:

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

Zastosowanie greatest zamiast coalesce i sprawdzić wartość nie jest równa 0:

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