este es mejor y más pequeño
usuario "bobince" casi lo tenía. Lo descubrí y lo hice funcionar porque tengo un poco más de experiencia en MySQL que la mayoría. Sin embargo, puedo ver por qué la respuesta de Bobince podría asustar a la gente. Su consulta es incompleta. Primero debe seleccionar parent_left y parent_right en las variables de mysql.
Las dos consultas siguientes se supone que su tabla se denomina tree
, su columna de la izquierda se llama lft
, columna derecha se llama rgt
, y que la clave principal se denomina id
. Cambie estos valores para satisfacer sus necesidades. Además, examine la primera declaración de selección. Verás que estoy buscando los descendientes inmediatos del nodo 5. Cambia el número 5 para buscar hijos del nodo que quieras.
Personalmente creo que esta es una consulta más esbelta, más sexy y más eficiente que las otras presentadas hasta ahora.
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
"... He combinado el conjunto anidado con listas de adyacencia ..." Ja! Eso es lo que estoy haciendo. Me uno a un adj. vista de lista, basada en una consulta de Joe Celko. Simplemente parece una gran cantidad de código. Incluso la solución del artículo vinculado es ... verbosa. – Metaphile
Es decir, comparar seleccionando _todos_ los descendientes de un nodo: SELECCIONAR * FROM nodes WHERE nodes.leftBound ENTRE parentLeftBound Y parentRightBound; – Metaphile
Bueno, el "child_view" es bastante simple, SELECCIONE * FROM nodos DONDE parent_id = 123456: D –