Přidáním sloupce cesty a spouštěče to lze provést poměrně snadno.
Nejprve přidejte sloupec varchar, který bude obsahovat cestu od kořenového adresáře k uzlu:
ALTER TABLE category ADD path VARCHAR(50) NULL;
Potom přidejte spouštěč, který vypočítá cestu na insert:
(prostě spojí nové id s cestou rodiče)
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);
Poté jednoduše vyberte pořadí podle cesty:
SELECT name, path FROM category ORDER BY path;
Výsledek:
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
Viz fiddle .
Tímto způsobem jsou také minimální náklady na údržbu. Pole cesty je při vkládání skryté a vypočítává se pomocí triggeru. Odebrání uzlu nemá žádnou režii, protože se odstraní i všechny potomky uzlu. Jediný problém je při aktualizaci parent_id uzlu; Tak to nedělej! :)