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:
-
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.
-
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á:
-
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íalft=7
yrgt=10
(en este caso ya tiene un hijo) -
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.
-
Establezca
lft=<former parent rgt>
yrgt=<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.