Как видите, мне нужно упорядочить по root_id, чтобы я мог сгенерировать правильное дерево.
При построении модели с вложенным деревом никогда не делайте дубликаты на lft
и rgt
. На самом деле, вы должны объявить их уникальными.
В вашей модели данных наборы для категорий 1
и 8
перекрываются. Скажем, от 1
до 14
используются как для предметов 1
, так и 8
.
Заменить их следующими значениями:
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);
Теперь вам не нужно заказывать на root_id
.
Также, после получения дерева, есть ли способ упорядочить каждый узел по имени?
Нет простого способа, если только вы не вставите узлы в порядке имен с начала. У братьев и сестер с большим name
должно быть больше lft
и 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);
Вложенное дерево может иметь только один неявный порядок.
Существует также способ запроса списка смежности в MySQL
:
, однако вам придется создать дополнительный уникальный столбец заказа, если вы хотите заказать что-либо еще, кроме id
.
Вы также можете прочитать эту статью:
, который показывает, как более эффективно хранить и запрашивать вложенные множества.