Por favor refiérase a este artículo: Managing Hierarchical Data in MySQL.
En realidad, se han propuesto modelo para obtener los datos jerárquicos sin recursividad. En que usan lft (izquierda) y rgt (derecha) esto para columna adicional para almacenar información estructural de la tabla. lft y rgt se configuran como sigue
Root lft es 1. luego su primer hijo lft es el siguiente número luego su hijo en el siguiente número así sucesivamente hasta que no haya ningún niño entonces para ese nodo (nodo hoja) rgt será su lft +1. Y estableceremos los hermanos lft como rgt +1 y también seguiremos las mismas reglas.
Y si la numeración de todos los del niño se hace su voluntad de establecer los padres rgt a rgt 1 del último hijo.
no he explicarlo claramente, pero en el enlace con la imagen que es más fácil de entender.
Así que después de esto se puede explorar la estructura anidada utilizando consultas siguientes
Para conseguir Identificación del todo de los padres con el fin de:
SELECT parent.category_id
FROM article AS node,
article AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.category_id = $category_id
ORDER BY parent.lft;
para eliminar cualquier fila:
LOCK TABLE article WRITE;
SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1
FROM article WHERE category_id = 'row_id';
DELETE FROM article WHERE lft BETWEEN @myLeft AND @myRight;
UPDATE article SET rgt = rgt - @myWidth WHERE rgt > @myRight;
UPDATE article SET lft = lft - @myWidth WHERE lft > @myRight;
UNLOCK TABLES;
Para insertar cualquier fila:
LOCK TABLE article WRITE;
SELECT @myLeft := lft FROM article WHERE category_id = 'parent_id';
UPDATE article SET rgt = rgt + 2 WHERE rgt > @myLeft;
UPDATE article SET lft = lft + 2 WHERE lft > @myLeft;
INSERT INTO article(title, lft, rgt) VALUES('title', @myLeft + 1, @myLeft + 2);
UNLOCK TABLES;
Esto es algo complejo, pero después de crear el procedimiento almacenado, no será difícil de usar.
gracias por compartir .. En este artículo se dará consulta de 4 nivel de hierarachy. aquí el nivel máximo de jerarquía puede ser desconocido para diferentes 'category_id'. – Vin