sql >> Database >  >> RDS >> Mysql

Hoe genereer je een boomstructuur van deze resultatenset op basis van Tree Traversal Algorithm?

Maak bij het bouwen van het geneste boommodel nooit duplicaten op lft en rgt . In feite zou je ze uniek moeten verklaren.

In uw gegevensmodel zijn de sets voor categorie 1 en 8 overlappen. Zeg, 1 tot 14 worden beide gebruikt voor items 1 en 8 .

Vervang ze door deze waarden:

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

U hoeft nu niet te bestellen op root_id .

Geen gemakkelijke manier, tenzij je de knooppunten vanaf het begin in de naamvolgorde invoegt. Broers en zussen met de grotere name zou een grotere lft . moeten hebben en 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);

Een geneste boom kan maar één impliciete volgorde hebben.

Er is ook een manier om de aangrenzende lijst op te vragen in MySQL :

, u moet echter een extra unieke bestelkolom maken als u iets anders wilt bestellen dan id .

Misschien wil je ook dit artikel lezen:

die laat zien hoe geneste sets efficiënter kunnen worden opgeslagen en doorzocht.



  1. Gegevens toevoegen aan een MySQL-databaseveld dat al gegevens bevat

  2. Hoe de tijd (in AM / PM) in SQL sorteren?

  3. SQL RANK() versus ROW_NUMBER()

  4. Is de tekenreeksoperator "+" zo eenvoudig?