Новости
Документация
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

> Original message text:
> 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 и т.д., но как ни странно я практически ничего не нашёл по хранимым процедурам...
>


From: Jyrkka - 09/06/2008 - 19:01:20
Subject:Опять деревья...
-----------------
Теперь вопрос в том, как можно было бы это сделать ещё, может есть более эффективный и/или правильный и/или красивый метод о котором я не подумал...поделитесь пожалуйста своим соображениями - буду очень рад и признателен...


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

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

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



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