2008-11-25 11 views

Respuesta

5

El artículo Managing Hierarchical Data in MySQL proporciona un excelente ejemplo de cómo usar conjuntos anidados y ofrece ejemplos de muchas consultas comunes, incluida esta.

aquí es cómo encontrar los elementos secundarios inmediatos de un nodo:

SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth 
FROM nested_category AS node, 
    nested_category AS parent, 
    nested_category AS sub_parent, 
    (
     SELECT node.name, (COUNT(parent.name) - 1) AS depth 
     FROM nested_category AS node, 
     nested_category AS parent 
     WHERE node.lft BETWEEN parent.lft AND parent.rgt 
     AND node.name = '**[[MY NODE]]**' 
     GROUP BY node.name 
     ORDER BY node.lft 
    )AS sub_tree 
WHERE node.lft BETWEEN parent.lft AND parent.rgt 
    AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt 
    AND sub_parent.name = sub_tree.name 
GROUP BY node.name 
HAVING depth = 1 
ORDER BY node.lft; 

y luego combinar eso con el hecho de que un nodo hoja tendrá rgt igual a lft + 1, y ya está. perdón el juego de palabras.

+0

La máquina de retorno tiene [una copia del artículo enlaces de nickf] (http://web.archive.org/web/20100105135622/http://dev.mysql.com/tech-resources/articles/hierarchical- data.html). – Segfault

+2

@Segfault El artículo está ahora en el sitio de su autor, corrigí el enlace en la respuesta. –

+0

Esto requiere (o más bien asume) que todos los nodos tienen nombres únicos, que a menudo no lo hacen en la práctica – Madbreaks

-1

Para especificar y diferenciar los nodos de hoja, guárdelos con left = right. Esto cambia dos cosas:

  1. Las hojas son fácilmente identificables.
  2. Al hacer una inserción, agregará solo uno a los valores (a la izquierda donde> hoja nueva, justo donde> = hoja).
+0

No veo cómo 'left = right' es mejor que' left = right-1', al menos no lo suficiente como para romper un principio de diseño de conjunto anidado. – Madbreaks

1

Hacemos mucho desarrollo con conjuntos anidados en nuestra base de datos. Los valores izquierdo y derecho de un nodo padre siempre establecerán los límites de los valores para sus hijos.

encontrar niños de cualquier nodo mediante pruebas de función hepática y rgt valores:

select 
    child.id, 
    child.lft, 
    child.rgt 
from 
    nodes child, 
    nodes parent 
where 
    child.lft between parent.lft and parent.rgt 
    and parent.id != child.id 
    and parent.id = [ID]; 

Lo que hemos hecho aquí se crea un alias a la misma mesa para niño y el padre, entonces encontrar a los niños que se ajustan entre el nodo principal dado. el parent.id != child.id elimina la entrada redundante en la salida.

+1

Esto no cumple con el requisito de op: * Tengo que encontrar todos sus hijos directos (** no nietos **) * – Madbreaks

Cuestiones relacionadas