Mysql
 sql >> Database >  >> RDS >> Mysql

ordine gerarchia ad albero sql

Aggiungendo una colonna di percorso e un trigger, questo può essere fatto abbastanza facilmente.

Per prima cosa aggiungi una colonna varchar che conterrà il percorso dalla radice al nodo:

ALTER TABLE category ADD path VARCHAR(50) NULL;

Quindi aggiungi un trigger che calcola il percorso all'inserimento:

(semplicemente concatena il nuovo id con il percorso del genitore)

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

Quindi seleziona semplicemente ordina per percorso:

SELECT name, path FROM category ORDER BY path;

Risultato:

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

Vedi violino .

In questo modo anche i costi di manutenzione sono minimi. Il campo del percorso è nascosto durante l'inserimento e viene calcolato tramite trigger. La rimozione di un nodo non comporta alcun sovraccarico, poiché vengono rimossi anche tutti i figli del nodo. L'unico problema è quando si aggiorna il parent_id di un nodo; Bene, non farlo! :)