sql >> Databáze >  >> RDS >> Mysql

hierarchie stromu objednávky SQL

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! :)



  1. Jaký je nejlepší způsob, jak uniknout uživatelskému vstupu pro regulární výrazy v MySQL?

  2. Přesunout data SQL z jedné tabulky do druhé

  3. Jak vytvořím kontrolní omezení pro více tabulek?

  4. ORA - 00933 záměna s vnitřním spojem a as