Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

ordem hierarquia de árvore sql


Ao adicionar uma coluna de caminho e um gatilho, isso pode ser feito com bastante facilidade.

Primeiro adicione uma coluna varchar que conterá o caminho da raiz para o nó:
ALTER TABLE category ADD path VARCHAR(50) NULL;

Em seguida, adicione um gatilho que calcule o caminho na inserção:

(simplesmente concatena o novo id com o caminho do pai)
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);

Em seguida, basta selecionar a ordem por caminho:
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

Veja violino .

Desta forma, o custo de manutenção também é mínimo. O campo de caminho fica oculto ao inserir e é calculado via trigger. A remoção de um nó não tem sobrecarga, pois todos os filhos do nó também são removidos. O único problema é ao atualizar o parent_id de um nó; Bem, não faça isso! :)