2010-02-27 10 views
6

Ho una tabella con relazione genitore-figlio che voglio contribuire a query ricorsivedati gerarchici in MySql

Struttura della tabella

roleId, roleName,  parentId 
1  Admin   0 
2  Backup Admin 1 
3  Office User 1 0 
4  User 1   3 
5  User 2   3 
6  Office User 2 0 
7  Off User 1  6 

che sto cercando di fare query ricorsive, ma io non sono in grado di fare per favore mi suggeriscono come dovrei interrogare database di esempio

Admin 
    -- Backup Admin 
    Office User 1 
    -- User 1 
    -- User 2 
    Office User 2 
    -- Off User 1 

risposta

2

Come sottolineato in precedenza questo non è davvero ricorsiva, ma se si sa quanti passi in profondità è necessario andare al massimo, è possibile utilizzare qualcosa in questo senso (forse utilizzare PHP per generare la query):

avevo prima serie ID genitore a NULL invece di 0, ma questo è preferenze personali.

SELECT * FROM table t1 
LEFT JOIN table t2 ON t2.parent_id = t1.role_id 
LEFT JOIN table t3 ON t3.parent_id = t2.role_id 
WHERE t1.parent_id IS NULL 

^^ per quanto profondo sia necessario andare in quel caso.

[bit successivo non strettamente pertinenti]

È quindi possibile manipolare l'uscita qualcosa in queste righe:

SELECT 
     (CASE 
     WHEN (t1.name IS NULL AND t2.name IS NULL) THEN t3.name 
     WHEN (t1.name IS NULL AND t2.name IS NOT NULL) THEN t2.name 
     ELSE t1.name END) AS first, 
     (CASE 
     WHEN (t1.name IS NOT NULL AND t2.name IS NOT NULL) THEN t2.name 
     WHEN (t2.name IS NULL AND t3.name IS NOT NULL) THEN NULL 
     ELSE t3.name END) AS second, 
     (CASE 
     WHEN (t1.name IS NOT NULL) THEN t3.name 
     ELSE NULL END) AS third 
FROM 
+0

Edit: La seconda parte probabilmente non è rilevante per il vostro problema, questo solo assegna il valore "profondo" nella colonna "primo". –

1

MySQL direttamente non supporta query ricorsive.

Avrete bisogno di emulare scrivendo una funzione che mantiene lo stack ricorsione in una variabile di sessione.

veda questo articolo nel mio blog su come fare questo:

2

Query tavolo una volta, ottenendo tutti i nomi e gli ID, quindi costruire l'albero in qualsiasi linguaggio di programmazione sta utilizzando.