questo è meglio e più piccolo
utente "bobince" quasi l'aveva. L'ho capito e ho funzionato per me perché ho un po 'più di esperienza MySQL di molti altri. Tuttavia, posso capire perché la risposta di Bobince potrebbe spaventare la gente. La sua richiesta è incompleta. Devi prima selezionare parent_left e parent_right nelle variabili mysql.
Le due query sotto supporre che la tabella si chiama tree
, la colonna di sinistra è chiamato lft
, colonna di destra è chiamato rgt
, e che la chiave primaria è chiamato id
. Cambia questi valori in base alle tue esigenze. Inoltre, esaminare la prima istruzione select. Vedrai che sto cercando i discendenti immediati del nodo 5. Cambia il numero 5 per cercare i figli di qualunque nodo tu voglia.
Personalmente ritengo che questa sia una query più elegante, più sexy e più efficiente rispetto agli altri presentati finora.
SELECT `lft`, `rgt` INTO @parent_left, @parent_right FROM efm_files WHERE `id` = 5;
SELECT `child`.`id`
FROM `tree` AS `child`
LEFT JOIN `tree` AS `ancestor` ON
`ancestor`.`lft` BETWEEN @parent_left+1 AND @parent_right-1 AND
`child`.`lft` BETWEEN `ancestor`.`lft`+1 AND `ancestor`.`rgt`-1
WHERE
`child`.`lft` BETWEEN @parent_left+1 AND @parent_right-1 AND
`ancestor`.`id` IS NULL
"... ho unito il set nidificato con liste di adiacenza ..." Ah! È quello che sto facendo. Mi unisco a un adj. visualizzazione elenco, basata su una query di Joe Celko. Sembra solo un sacco di codice. Anche la soluzione dell'articolo correlato è ... prolissa. – Metaphile
Voglio dire, confrontare la selezione di tutti i discendenti di un nodo: SELECT * FROM nodes WHERE nodes.leftBound BETWEEN parentLeftBound AND parentRightBound; – Metaphile
Bene, "child_view" è piuttosto semplice, SELECT * FROM nodes WHERE parent_id = 123456: D –