2012-05-18 12 views
20

Ho un disegno di legge di tabella di materiali che è impostato in questo modo:
voce - genitoreUsando query MySQL per attraversare le righe per fare un albero ricorsivo

Il risultato finale, quando visualizzo la distinta base è che viene visualizzato nel seguente modo:

item 1 - parent 0  
    item 2 - parent 1  
    item 3 - parent 1  

Il risultato finale potrebbe anche essere a più livelli in questo modo:

item 3 - parent 0  
    item 4 - parent 3  
    item 76 - parent 3  

E può andare avanti all'infinito:

item 76 - parent 0  
    item 46 - parent 76  

item 46 - parent 0  
    item 25 - parent 46 

In questo momento, mi sia appena ottenere 1 livello dal database:

SELECT * FROM bom WHERE parentId = $itemId (shorthand)

o tirare ogni riga della tabella e utilizzare la mia funzione ricorsiva di risolvere solo quelli di cui ho bisogno, ma questo è ovviamente inefficiente perché potrei aver bisogno solo di 10 righe, ma tiro 10.000 record. L'uscita della funzione ricorsiva sarà solo creare un albero come questo:

item 1 
    item 2 
    item 3 
     item 4 
     item 76 
     item 46 
      item 25 

Tutto quello che so è che sto iniziando al punto 1. Articolo 5 potrebbe avere un genitore di 11; non devono andare in sequenza. Voglio ottenere tutti i rami figlio nell'albero. Come posso fare questa query in mysql?

risposta

35

Indietro in 24 ottobre 2011, qualcuno ha inviato un question in the DBA StackExchange about tree traversal in MySQL. SQL per MySQL non può supportarlo.

ho scritto tre procedure (3) Stored (GetParentIDByID, GetAncestry e GetFamilyTree) in my answer to that question. Spero che questa informazione ti aiuti a costruire ciò che stai cercando.

+0

Ottima procedura. Ma poi 'SELECT id, GetFamilyTree (id) FROM pctable;' genera un errore: _ERROR 1292 (22007): Valore DOUBLE errato troncato: '4,5'_. Ho provato a eseguire il debug, ma invano. Avresti qualche idea! Grazie – idok

15

Bill Karwin ha pubblicato una presentazione su heirarchical data in MySQL. Se la modifica della progettazione del database è un'opzione, esistono altri modi accattivanti per archiviare i dati per rendere più facile la query. Gli approcci che copre sono:

  • lista di adiacenza
  • Percorso Enumeration
  • annidata Imposta
  • Chiusura Tabella

diapositive 69 ha un bel tavolo mostrando i pro ei contro di ciascun metodo, quindi ti suggerisco di guardare prima la diapositiva per vedere quale approccio potrebbe funzionare per te, quindi tornare indietro e osservare i dettagli su come implementarlo. Tieni presente che il design che hai scelto (elenco di adiacenze) è il solo uno dei quattro progetti presentati che rende difficile interrogare una sottostruttura.

Detto questo, se non è possibile modificare il progetto o si desidera attenersi alla lista di adiacenze, devo concordare con Didier che si dovrebbe dare un'occhiata all'articolo "Hierarchical queries in MySQL"Quassnoi. È un articolo molto chiaro e spiega come scrivere la query in modo efficiente.

+2

Grande risorsa. L'ho messo per la taglia per ottenere informazioni in questo modo. Grazie! – phpmeh

Problemi correlati