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

Como gerar uma visualização em árvore a partir deste conjunto de resultados com base no algoritmo de travessia de árvore?


Ao construir o modelo de árvore aninhada, nunca faça duplicatas em lft e rgt . Na verdade, você deve declará-los únicos.

No seu modelo de dados, os conjuntos para a categoria 1 e 8 sobreposição. Digamos, 1 para 14 são usados ​​tanto para itens 1 e 8 .

Substitua-os por estes valores:
INSERT INTO `categories` VALUES(1, NULL, NULL, 'Fruits', 1, 14);
INSERT INTO `categories` VALUES(2, 1, 1, 'Apple', 2, 3);
INSERT INTO `categories` VALUES(3, 1, 1, 'Orange', 4, 9);
INSERT INTO `categories` VALUES(4, 3, 1, 'Orange Type 1', 5, 6);
INSERT INTO `categories` VALUES(5, 3, 1, 'Orange Type 2', 7, 8);
INSERT INTO `categories` VALUES(6, 1, 1, 'Pear', 10, 11);
INSERT INTO `categories` VALUES(7, 1, 1, 'Banana', 12, 13);
INSERT INTO `categories` VALUES(8, NULL, NULL, 'Eletronics', 15, 29);
INSERT INTO `categories` VALUES(9, 8, 8, 'Cell Phones', 16, 17);
INSERT INTO `categories` VALUES(10, 8, 8, 'Computers', 19, 24);
INSERT INTO `categories` VALUES(11, 10, 8, 'PC', 20, 21);
INSERT INTO `categories` VALUES(12, 10, 8, 'MAC', 22, 23);
INSERT INTO `categories` VALUES(13, 8, 8, 'Printers', 25, 26);
INSERT INTO `categories` VALUES(14, 8, 8, 'Cameras', 27, 28);

Agora você não precisa fazer pedidos em root_id .

Não é fácil, a menos que você insira os nós na ordem dos nomes desde o início. Irmãos com o maior name deve ter maior lft e rgt :
INSERT INTO `categories` VALUES(1, NULL, NULL, 'Fruits', 1, 14);
INSERT INTO `categories` VALUES(2, 1, 1, 'Apple', 2, 3);
INSERT INTO `categories` VALUES(7, 1, 1, 'Banana', 4, 5);
INSERT INTO `categories` VALUES(3, 1, 1, 'Orange', 6, 11);
INSERT INTO `categories` VALUES(4, 3, 1, 'Orange Type 1', 7, 8);
INSERT INTO `categories` VALUES(5, 3, 1, 'Orange Type 2', 9, 10);
INSERT INTO `categories` VALUES(6, 1, 1, 'Pear', 12, 13);

Uma árvore aninhada pode ter apenas uma ordem implícita.

Há também uma maneira de consultar a lista de adjacências em MySQL :

, no entanto, você terá que criar uma coluna de ordenação exclusiva adicional se quiser ordenar algo diferente de id .

Você também pode querer ler este artigo:

que mostra como armazenar e consultar conjuntos aninhados com mais eficiência.