У меня есть эти данные:
id | parent_id | lft | rgt | name
=====================================
1 | 0 | 1 | 8 | abc
2 | 3 | 5 | 6 | jkl
3 | 1 | 2 | 3 | def
4 | 0 | 9 | 10 | mnno
5 | 1 | 4 | 7 | ghi
Мне нужно пройти эту иерархию в этом порядке (ids): 1 > 3 > 5 > 2 > 4
Как я могу это достичь?
Предположим, что я хочу найти следующий node узла_x.
if (node_x_rgt - node_x_lft == 1) {
next_node_lft = node_x_rgt + 1;
} else {
next_node_lft = node_x_lft + 1;
}
Эта формула работает только в некоторых случаях (node ids 1,3,5,2). Следующий node из node 2 должен быть 4.
С информацией, которую вы дали, я могу посоветовать:
select * from table order by id
btw, столбцы lft и rgt для id 4 находятся вне дерева, выглядит как ошибка?
btw2, если это домашнее задание, отметьте его как таковое.
Изменить: версия 2 вопроса:
Эти типы деревьев имеют такой же инвариант, что (lft < rgt)
для всех узлов. Если таблица содержит только 1 корень node, последовательности могут быть получены либо значениями lft, либо rgt, в этом случае lft все еще выполняет трюк (но альтернатива через rgt в порядке убывания не будет):
select * from table order by lft