2010-07-18 12 views
9

Ho la seguente tabella:ricorsivo interrogazione auto

myTable: 
+----+----------+ 
| id | parentID | 
+----+----------+ 
| 1 |  null | 
| 2 |  1 | 
| 3 |  1 | 
| 4 |  2 | 
| 5 |  4 | 
----------------- 

vorrei ottenere tutte le righe risalire fino a quando non c'è più alcun parentID. Così " .... dove id = 5" mi avrebbe dato:

5, 4, 2, 1 
+4

Bill Bill Karwin ha creato una buona spiegazione dei dati gerarchici e come utilizzare le diverse soluzioni: http://www.slideshare.net/billkarwin/models-for-hierarchical-data – Wrikken

+0

MySQL non ha CTE ricorsive quindi penso questo avrebbe bisogno di un cursore se hai bisogno di gestire una profondità arbitraria. Sta cambiando la struttura http://dev.mysql.com/tech-resources/articles/hierarchical-data.html un'opzione? Oppure possiamo assumere una profondità massima? Vedi anche questa domanda correlata http://stackoverflow.com/questions/169817/is-it-possible-to-query-a-tree-structure-table-in-mysql-in-a-single-query-to-any –

+0

Le diapositive di Bill Karwin sono davvero fantastiche. – iddqd

risposta

9

Si intendono organizzare i tuoi dati gerarchici utilizzando il adjacency list model. Il fatto che tali operazioni ricorsive siano difficili è in effetti uno dei principali inconvenienti di questo modello.

Alcuni DBMS, come SQL Server 2005, Postgres 8.4 e Oracle 11g, supportano le query ricorsive utilizzando common table expressions con la parola chiave WITH.

Per quanto riguarda MySQL, si può essere interessati a verificare il seguente articolo che descrive un modello alternativo (la nested set model), il che rende le operazioni ricorsive più facile (possibili):

Inoltre, suggerisco anche di verificare Bill Karwin's presentation sottolineato nei commenti sopra. Il modello della tabella di chiusura descritto è un'alternativa molto valida al set nidificato.

+0

ok, molte grazie per i collegamenti e commenti, ho capito ora. Dal momento che non presumo che gli alberi siano molto profondi e di cui ho bisogno raramente, ho deciso di fare solo due join automatici, e se il parentID non è ancora NULL, eseguo nuovamente la query. – iddqd

+0

@iddqd: Sì, è fattibile. Ma come stai vedendo, questa è la limitazione di questo modello. –

+0

assolutamente, grazie. – iddqd