Pregunta

¿Cómo calculo la profundidad de un nodo en un modelo de padre-hijo en virtud de MySQL?

Voy a necesitar la profundidad a, entre otras cosas, crear el guión en mi lista (estará con PHP).

¿Fue útil?

Solución 2

Esto podría ser una vieja pregunta, pero sólo quiero que los demás sepan que he encontrado una solución hace unos meses. Yo he escrito recientemente sobre ello aquí: http: // en. someotherdeveloper.com/articles/adjacency-list-model-with-depth-calculation/

Otros consejos

Eso depende de la aplicación real de su jerarquía en la base de datos. Si está utilizando el modelo conjuntos anidados ( http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ ) se puede recuperar la ruta completa de padre a hijo a través de una selección única.

Actualizar : Ok, ya vas con el modelo de lista de adyacencia Sugiero para almacenar nivel de nodo en la tabla. No sólo va a darle la profundidad de nodo en una consulta, sino que también le permitirá recuperar toda la ruta a ese nodo en una consulta (aunque esa consulta tendría que ser generado de forma dinámica):

SELECT n1.name AS lvl1, n2.name as lvl2, n3.name as lvl3, ..., nN.name as lvlN
  FROM nodes AS n1
  JOIN nodes AS n2 ON n2.parent_id = n1.id
  JOIN nodes AS n3 ON n3.parent_id = n2.id
  ...
  JOIN nodes AS nN ON nN.parent_id = n(N-1).id
WHERE nN.id = myChildNode;

Puesto que usted sabe que su nodo está en el nivel N que no hay necesidad de izquierda se une y, teniendo en cuenta los índices adecuados en Usuario / parent_id este debe ser razonablemente rápido.
La desventaja de este enfoque es que usted tiene que mantener el nivel de nodo actualizado durante el nodo se mueve, sino que debe ser razonablemente fácil y rápido, ya que sólo lo haría por el propio nodo y sus hijos - no para la mayoría de la mesa como que se haría con conjuntos anidados.

Si quiere simplemente para copiar y pegar aquí está mi ejemplo. Tengo Proyectos de mesa con el ID y parent_id campos campos.

DELIMITER $$
DROP FUNCTION IF EXISTS `getDepth` $$
CREATE FUNCTION `getDepth` (project_id INT) RETURNS int
BEGIN
    DECLARE depth INT;
    SET depth=1;

    WHILE project_id > 0 DO
        SELECT IFNULL(parent_id,-1) 
        INTO project_id 
        FROM ( SELECT parent_id FROM Projects WHERE id = project_id) t;

        IF project_id > 0 THEN
            SET depth = depth + 1;
        END IF;

    END WHILE;

    RETURN depth;

END $$
DELIMITER ;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top