2012-11-14 14 views
10

Ho una tabella del tipo:MySql: ORDER BY genitore e figlio

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

che mostra un semplice 2 livelli -corelation, "padre-figlio". Come posso ORDINARE da una istruzione SELECT per ottenere l'ordine come nella lista qui sopra, il che significa: primo genitore, figlio di 1o genitore, 2o genitore, figlio di 2o genitore e così via (se ho quello, posso aggiungere il ORDINA PER i bambini ... spero). È possibile senza aggiungere un campo di ordinamento?

risposta

43

compresi i bambini di smistamento da ID:

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

SQL Fiddle example

Spiegazione:

  • COALESCE(parent, id): Ordina (in modo efficace il raggruppamento) id del genitore.
  • parent IS NOT NULL: Mettere la riga padre in cima al gruppo
  • id: Finalmente sorta tutti i bambini (lo stesso genitore, e parent non è nullo)
0

Se la tabella utilizza 0 invece di null per indicare una voce con nessun genitore:

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

Uso greatest invece di coalesce e verificare il valore non è uguale 01.239.074,821 mila:

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