sql >> Base de Datos >  >> RDS >> Mysql

Consulta Mysql que devuelve el árbol de categorías

No hay una consulta SQL única que puede brindarle resultados ordenados de la manera que espera en función de esta estructura de tabla.

Hay dos formas de resolver el problema:

  1. Utilice la lógica de la aplicación externa (fuera de la base de datos) para realizar llamadas recursivas que descubrirán elementos secundarios de cada categoría y construirán el árbol en la aplicación.

  2. Utilice uno de los algoritmos para almacenar datos de árboles en una base de datos relacional. Uno de esos algoritmos se llama Modified Preorder Tree Traversal o simplemente MPTT.

Asumiendo que usamos columnas lft y rgt para mantener los índices izquierdo/derecho en el recorrido, cuando inserte una nueva categoría deberá:

  1. Obtener información de la categoría principal por ID:SELECT lft,rgt FROM tbl_categories WHERE categoryId=5 Supongamos, por ejemplo, que la categoría principal tenía lft=7 y rgt=10 (en este caso ya tiene un hijo)

  2. Haga espacio para una nueva entrada:cambie todos los registros por 2 (1 para lft y 1 para rgt):

    UPDATE tbl_categories SET rgt=rgt+2 WHERE rgt>=10 ORDER BY rgt DESC

    UPDATE tbl_categories SET lft=lft+2 WHERE lft>=10 ORDER BY lft DESC

Tenga en cuenta aquí ORDER descendiendo Como lft y rgt se supone que son únicos, se recomienda hacer un UNIQUE Se necesita una restricción sobre ellos, y luego se necesita un orden descendente en la actualización para evitar errores de clave duplicada.

  1. Establezca lft=<former parent rgt> y rgt=<former parent rgt +1> e inserte un nuevo registro...

    INSERT INTO tbl_categories SET categoryName="New Child",parentCategoryId=5,lft=11,rgt=12,...

Puede encontrar ejemplos más detallados con código si busca MPTT PHP MySQL . Hay bastantes tutoriales sobre este tema.