Модель вложенного набора: дочерний узел запроса находится только на 1 уровень ниже, а все родители выше

#php #mysql #sql

#php #mysql #sql

Вопрос:

Я использую модель вложенного набора с MySQL для создания иерархической древовидной модели.

Мне успешно удалось получить узел и все его дочерние элементы на 1 уровень ниже (мне нужно получить только 1 подуровень)

Однако я хотел бы, чтобы не только все дочерние элементы были на 1 уровень ниже, но и все родители выше этого узла.

Можно ли изменить текущий запрос, чтобы получить то, что я хочу?

Это мой код (на самом деле он взят с этого нерабочего сайта: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql / но у меня точно такой же):

 SELECT node.name, (COUNT(parent.name) - (sub_tree.depth   1)) AS depth
FROM nested_category AS node,
nested_category AS parent,
nested_category AS sub_parent,
(
    SELECT node.name, (COUNT(parent.name) - 1) AS depth
    FROM nested_category AS node,
    nested_category AS parent
    WHERE node.lft BETWEEN parent.lft AND parent.rgt
    AND node.name = 'PORTABLE ELECTRONICS'
    GROUP BY node.name
    ORDER BY node.lft
)AS sub_tree
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
AND sub_parent.name = sub_tree.name
GROUP BY node.name
HAVING depth <= 1
ORDER BY node.lft;
  

Древовидная структура выглядит следующим образом:

 Electronics
--Televisions
----LCD
--Portable Electronics
----MP3 Players
------Flash
----CD Players
  

Используя мой текущий код выше, я получаю это:

 --Portable Electronics
----MP3 Players
  

Но мне нужно получить что-то вроде этого:

 Electronics
--Portable Electronics
----MP3 Players
  

Я буду использовать этот запрос позже в PHP, поэтому я тоже могу использовать решение на основе PHP (или его часть).

Спасибо

Ответ №1:

Я думаю, вы хотите разделить это на несколько запросов. Сначала элемент «ПОРТАТИВНАЯ ЭЛЕКТРОНИКА» со всеми его дочерними элементами, как вы делаете сейчас. После этого легко получить родительские элементы, просто извлеките все элементы WHERE left < [PE-left] AND right > [PE-right] .

Комментарии:

1. Но как мне тогда присоединиться к ним? ОБЪЕДИНЕНИЕ SQL? Пробовал, но не удалось .. может быть, у кого-то есть несколько примеров. Спасибо.

Ответ №2:

Мне удалось решить проблему, используя несколько запросов.

Первый запрос извлекает всех родителей выше узла (как предложил Рийк), а второй запрос извлекает все, что находится ниже узла (код, опубликованный в исходном сообщении). Затем, используя UNION ALL, я объединил все в один результирующий набор.

Однако я больше не мог использовать столбец глубины для создания отступов, поэтому для форматирования страницы для дочерних элементов я использовал функцию на основе php для отступов узлов ( http://www.sitepoint.com/hierarchical-data-database-2 / )

Примечание: мне пришлось добавить оператор if / else в конце этого кода, чтобы сделать отступ только для родительских узлов, а не для всего.

Ответ №3:

У меня была такая же проблема. Похоже, это сработало.

 SELECT parent.name
FROM nested_category AS node,nested_category AS parent,nested_category AS midpoint
WHERE (node.lft BETWEEN parent.lft AND parent.rgt) AND (node.lft BETWEEN midpoint.lft AND midpoint.rgt) AND midpoint.name='PORTABLE ELECTRONICS'
GROUP BY parent.name
ORDER BY node.lft;