Я реализовал модифицированный обход дерева предзаказа как объяснено здесь по причинам оптимизации. Моя таблица примерно такая:
+----+-----------+------+-------+
| id | parent_id | left | right |
+----+-----------+------+-------+
| 1 | NULL | 1 | 4 |
| 2 | 1 | 2 | 3 |
| 3 | NULL | 1 | 4 |
| 4 | 3 | 2 | 3 |
+----+-----------+------+-------+
То есть в таблице существует произвольное количество деревьев. Если идентификатор родительского узла равен нулю, то это автоматически означает, что узел является самой основой его дерева.
В статье указывается, что можно очень просто выбрать всех потомков узла:
SELECT *
FROM table
WHERE
left > ?
AND
right < ?
Теперь моя проблема заключается в том, что выбор, очевидно, будет включать в себя узлы других деревьев. В конце концов, я даже не указал дерево для начала. Можно ли просто выбрать узлы из одного указанного дерева с этой моделью?
Не начинайте новое дерево с left
= 1. Используйте MAX (right
) +1 для left
значение. Это не повлияет на другие манипуляции с узлами, и деревья будут разделены левым и правым диапазоном.
Других решений пока нет …