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




MySQL.RU - Webboard



Вернуться
Выборка прородителия из иерархии. (Aco) 28/12/2007 - 09:48:48
      Re: Выборка прородителия из иерархии. (vi.k) 28/12/2007 - 14:22:32
      Re: Выборка прородителия из иерархии. (vi.k) 28/12/2007 - 15:23:15
      Re: Выборка прородителия из иерархии. (vi.k) 28/12/2007 - 15:26:14
      Re: Выборка прородителия из иерархии. (Aco) 02/01/2008 - 16:55:53

> Original message text:
> From: Aco - 28/12/2007 - 09:48:48
> Subject:Выборка прородителия из иерархии.
> -----------------
> Задача проста, несмотря на названии темы.
> Есть таблица типа
> item_id parent_id data
> 1 0 ...
> 2 1 ...
> 3 1 ...
> 4 2 ...
> 5 4 ...
> 6 4 ...
> 7 0 ...
> 8 2 ...
> parent_id - это item_id родителя, которому принадлежит элемент, например, 2 принадлежит 1,4 принадлежит 2,6, соответственно 4 и тд. Элементы с parent_id=0 - прородители, не принадлежат никому.
> Задача: реально-ли одним(с join, вложеными селектами или нет ) запросам выбрать прородителя любого элемента?
>


From: vi.k - 28/12/2007 - 15:23:15
Subject:Выборка прородителия из иерархии.
-----------------
DELIMITER $$
DROP FUNCTION IF EXISTS `test`.`get_ancestry` $$
CREATE FUNCTION `test`.`get_ancestry` (id INT UNSIGNED) RETURNS INT
BEGIN
DECLARE p_id INT UNSIGNED;
SET p_id=(SELECT DISTINCT `parent_id` FROM `items` WHERE `item_id`=id);
WHILE p_id != 0 AND p_id IS NOT NULL DO
SET id = p_id;
SET p_id=(SELECT DISTINCT `parent_id` FROM `items` WHERE `item_id`=id);
END WHILE;
RETURN IF(p_id IS NULL, NULL, id);
END $$
DELIMITER ;

-------------------------

SELECT `item_id`, `data`, get_ancestry(`item_id`) FROM `items`;

1 | ! | 1 |
2 | ->1 | 1 |
3 | ->1 | 1 |
4 | ->2->1 | 1 |
5 | ->4->2->1 | 1 |
6 | ->4->2->1 | 1 |
7 | ! | 7 |
8 | ->2->1 | 1 |
9 | ->7 | 7 |
10 | ->9->7 | 7 |
11 | ->10->9->7 | 7 |
12 | ->13->? | NULL |



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

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

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



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