sql >> Database >  >> RDS >> Mysql

bestel sql-boomhiërarchie

Door een padkolom en een trigger toe te voegen, kan dit vrij eenvoudig worden gedaan.

Voeg eerst een varchar-kolom toe die het pad van root naar het knooppunt bevat:

ALTER TABLE category ADD path VARCHAR(50) NULL;

Voeg vervolgens een trigger toe die het pad bij invoegen berekent:

(concat eenvoudig de nieuwe id met het pad van de ouder)

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);

Selecteer vervolgens eenvoudig volgorde op pad:

SELECT name, path FROM category ORDER BY path;

Resultaat:

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

Zie fiddle .

Op deze manier zijn de onderhoudskosten ook minimaal. Het padveld wordt verborgen bij het invoegen en wordt berekend via trigger. Het verwijderen van een knooppunt heeft geen overhead, aangezien alle kinderen van het knooppunt ook worden verwijderd. Het enige probleem is bij het updaten van de parent_id van een node; Nou, doe dat niet! :)



  1. MySQL:INT converteren naar DATETIME

  2. Weergaven in SQL Server

  3. sql-server:verwijder alle rijen van alle tabellen

  4. Hoe kan ik voorkomen dat Postgres een subquery inline invult?