Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Опять деревья... (Jyrkka) 09/06/2008 - 16:38:12
      Re: Опять деревья... (Jyrkka) 09/06/2008 - 18:56:27
      Re: Опять деревья... (Jyrkka) 09/06/2008 - 19:01:20
      Re: Опять деревья... (Dan) 15/07/2008 - 13:46:15



From: Jyrkka - 09/06/2008 - 16:38:12
Subject:Опять деревья...
-----------------
Доброго времени суток,
Работаю с 5.0.51b-community-nt на WinXP SP2.
Ломаю уже который день голову вот над каким вопросом:
Есть таблица (ID{PK}, Text, Parent{FK:rfcID}), таким образом, реализована структура дерева: у корневого элемента родитель NULL, а у дочерних элементов ID родителя. Пишу 2 хранимые процедуры, которые выдают текущую ветку вверх до корневого элемента, и вниз всё поддерево от текущего элемента. Вверх я придумал такую реализацию:
SelectTreeUp(IN node INT) /*node - ID Элемента в ветке, от него вверх и пойдём*/
BEGIN
CREATE TEMPORARY TABLE branch LIKE tree; /*Временная таблица, в которую будет занесена вся ветка, чтобы вывод был одним сетом.*/
ALTER TABLE branch MODIFY ID INT(10) UNSIGNED NOT NULL; /* Убиваем auto_increment, чтобы ID соответствовали ID в дереве*/

GoingUp: LOOP /*Идём циклом по дереву вверх*/

INSERT INTO branch (ID, Text, Parent) SELECT tree.ID, tree.text, @prnt := tree.Parent FROM tree WHERE tree.id = node; /*заносим текущий элемент ветки во временную таблицу*/

IF @prnt IS NULL THEN /*если элемент корневой - заканчиваем цикл*/
LEAVE GoingUp;
END IF;

SET node = @prnt; /*переходим на родительский элемент*/

END LOOP GoingUp;

SELECT * FROM branch; /*выводим ветку*/

DROP TABLE branch; /*убиваем временную таблицу*/
END

Такой подход работает, но я думаю, что есть и более оптимальные решения, если вам в голову придёт светлая мысль по данному поводу - поделитесь пожалуйста, буду очень благодарен. Я только недавно начал работать с хранимыми процедурами, поэтому всех тонкостей ещё не знаю...
Если не использовать временную таблицу то на каждый Select будет выдан однострочный сет, может и для этого есть более красивое решение?

Теперь вниз по дереву, логика, в общем, достаточна простая, взять элемент выбрать все элементы которым он приходится родителем и так далее для каждого... Только как это реализовать? Если тот же подход со временной таблицей для ветки, то как по ней передвигаться?, предположим начальная вершина туда занесена, а дальше нужно выбрать её детей, занести их во временную таблицу и идти дальше пока таблица не закончится(последние элементы не будут содержать детей, а значит и добавляться ничего не будет)... Думал курсорами, так ведь их надо определять в самом начале, а тогда ещё и таблицы с веткой нет, а как иначе перемещаться по таблице с веткой? Или нужен совершенно другой подход? Буду рад любой помощи, все мои поиски приводили меня к в большинстве своём к реализациям деревьев через PHP, PERL и т.д., но как ни странно я практически ничего не нашёл по хранимым процедурам...


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
33754



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |