Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment générer une arborescence à partir de cet ensemble de résultats basé sur l'algorithme de traversée d'arbre ?

Lors de la construction du modèle d'arbre imbriqué, ne faites jamais de doublons sur lft et rgt . En fait, vous devriez les déclarer uniques.

Dans votre modèle de données, les ensembles pour la catégorie 1 et 8 chevauchement. Dites, 1 à 14 sont utilisés à la fois pour les éléments 1 et 8 .

Remplacez-les par ces valeurs :

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

Maintenant, vous n'avez plus besoin de commander sur root_id .

Pas facile, sauf si vous insérez les nœuds dans l'ordre des noms depuis le début. Frères et sœurs avec le plus grand name devrait avoir un lft supérieur et 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);

Un arbre imbriqué ne peut avoir qu'un seul ordre implicite.

Il existe également un moyen d'interroger la liste de contiguïté dans MySQL :

, cependant, vous devrez créer une colonne de commande unique supplémentaire si vous souhaitez commander sur autre chose que id .

Vous pouvez également lire cet article :

qui montre comment stocker et interroger des ensembles imbriqués plus efficacement.