База данных: сортировка иерархических данных (измененный обход дерева предзаказа): как получить непосредственные дочерние элементы - PullRequest
2 голосов
/ 27 июля 2010

Я использую MySQL с PHP и Doctrine 2.

Мой вопрос предполагает, что я использую Модифицированный обход дерева предзаказа Есть ли способ получить только непосредственные потомки?

Ответы [ 3 ]

5 голосов
/ 27 июля 2010

Как вы обнаружили, это не так просто в конструкции MPTT.Вы знаете, как получить всех потомков:

SELECT * FROM tree WHERE lft BETWEEN 2 AND 11;

Вам нужен набор потомков, у которых нет предков, которые также являются потомками родительского узла, с которого вы начинаете.

SELECT * FROM tree t1 WHERE t1.lft BETWEEN 2 AND 11 
  AND NOT EXISTS (SELECT * FROM tree t2 WHERE t2.lft > 2 AND t2.lft < 11 
                    AND t1.lft > t2.lft AND t1.rgt < t2.rgt);
2 голосов
/ 27 июля 2010

В дополнение к значениям lft и rgt вы также можете хранить идентификатор родительского элемента каждого ребенка. Одним из преимуществ этого является то, что если ваши значения lft и rgt испорчены, вы можете восстановить дерево. Это также позволяет напрямую определять непосредственных потомков родительского узла.

1 голос
/ 23 марта 2012

Получил то же самое требование, гораздо более простой способ был бы

select * from tree t1
where t1.nodeleft > 1
and 1 in (select count(*) from tree where tree.nodeleft < t1.nodeleft and tree.noderight > t1.noderight)
...