Al agregar una columna de ruta y un disparador, esto se puede hacer con bastante facilidad.
Primero agregue una columna varchar que contendrá la ruta desde la raíz hasta el nodo:
ALTER TABLE category ADD path VARCHAR(50) NULL;
Luego agregue un disparador que calcule la ruta al insertar:
(simplemente combina la nueva identificación con la ruta del padre)
CREATE TRIGGER set_path BEFORE INSERT ON category
FOR EACH ROW SET NEW.path =
CONCAT(IFNULL((select path from category where id = NEW.parent_id), '0'), '.', New.id);
Luego simplemente seleccione ordenar por ruta:
SELECT name, path FROM category ORDER BY path;
Resultado:
pizza 0.1
piperoni 0.1.4
cheese 0.1.5
extra cheese 0.1.5.7
vegetariana 0.1.6
burger 0.2
coffee 0.3
Ver fiddle .
De esta manera el costo de mantenimiento también es mínimo. El campo de ruta se oculta al insertar y se calcula a través del disparador. La eliminación de un nodo no tiene gastos generales, ya que también se eliminan todos los elementos secundarios del nodo. El único problema es cuando se actualiza el parent_id de un nodo; Bueno, ¡no hagas eso! :)