recursive data sql nested-sets

data - Ayuda con la escritura de una consulta SQL para conjuntos anidados



mysql hierarchical data (3)

Estoy almacenando un árbol en una BD usando conjuntos anidados. Los campos de la tabla son id, lft, rgt y name.

Dado un ID de nodo, necesito encontrar todos sus hijos directos (no nietos) que son ellos mismos nodos hoja.


Para especificar y diferenciar los nodos de hoja, mantenlos 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 en> hoja nueva, justo donde> = hoja).

El artículo Gestión de datos jerárquicos en MySQL proporciona un excelente ejemplo de cómo usar conjuntos anidados y ofrece ejemplos de muchas consultas comunes, incluida esta.

a continuación se explica cómo encontrar los hijos 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 combine eso con el hecho de que un nodo hoja tendrá rgt igual a lft + 1 , y usted está configurado. perdón por el juego de palabras.


Hacemos un gran 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.

Para buscar hijos de cualquier nodo que use valores lft y rgt:

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 para la misma tabla para el elemento secundario y principal, luego busca los elementos que encajan entre el nodo padre dado. parent.id != child.id se deshace de la entrada redundante en la salida.