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




MySQL.RU - Webboard



Вернуться
Определение пренадлежности в структуре (Светлана PHP) 30/04/2005 - 14:29:23
      Re: Определение пренадлежности в структуре (Dinky) 30/04/2005 - 19:41:10
      Re: Определение пренадлежности в структуре (Светлана PHP) 02/05/2005 - 15:13:43
      Re: Определение пренадлежности в структуре (Dubrovsky) 02/05/2005 - 15:31:28
      Re: Определенность (Валентин) 04/05/2005 - 11:20:39

> Original message text:
> From: Светлана PHP - 30/04/2005 - 14:29:23
> Subject:Определение пренадлежности в структуре
> -----------------
> Есть древовидная структура построенная, скажем на таблице вида:
>
> ID, PID, NAME
>
> где ID - уникальный идентификатор, PID - идентификатор родителя в этой структуре (ID другого, 0 если нет родителя), NAME - что-то второстепенное...
>
> Вопрос:
> Допустим эта структура описывает дерево:
>
> (14,0)
> (22,14)
> (26,22)
> (28,22)
> (30,28)
> (40,30)
>
> Каким образом следует построить SQL запрос, чтобы выяснить, что 40 далёкий потомок 14.
> Сейчас это решается на уровне рекурсивной функции, один вызов которой соот-ет одному SQL запросу. А можно ли одним, но сложным запросом? И если можно, то как, и насколько это производительней этой рекурсивной функции.
>
> Спасибо за внимание
>


From: Валентин - 04/05/2005 - 11:20:39
Subject:Определенность
-----------------
Светлана :),
"Допустим эта структура описывает дерево: "
мне вот интересно, что может описывать такая структура еще :)
Этот вопрос мы обсуждали неоднократно, я согласен с Dinky, в том, что в представленной структуре ключ-ключ родителя без рекурсивной функции не разобраться, я например нарисовал ее как stored function, НО можно сделать так (повторение - мать учения)
Завести еще поле с ключами родителей тектовое, а потом с функцией FIND_IN_SET всегда знать где и кто находится. Ключи ложить через запятую.
т.е. рекурсивность никуда не делась, но она происходит при добавлении/изменении записи и в принципе оправдана по времени, но зато в запросах все становится проще.
А про http://detail.phpclub.ru/article/db_tree все и так давно знают.
Кстати способов значительно больше, чем в указанной статье :) не представляю ссылочку на это больше, потому что не нашел в Избранном, но гугль или яндекс в этом охотно помогут.
Если Вам нравится отвечать на свои вопросы, зачем тогда их задавать?

А пример хранимой функции такой
CREATE FUNCTION `lf_Get_GoodsMasterStr`(iID_Goods MEDIUMINT)
RETURNS varchar(50)
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE xMasterID MEDIUMINT;
DECLARE xRes VARCHAR(50);

SELECT MasterID
INTO xMasterID
FROM goods
WHERE ID=iID_Goods;

SET xRes='';
WHILE xMasterID IS NOT NULL DO
IF xRes='' THEN
SET xRes=xMasterID;
ELSE
SET xRes=CONCAT(xRes,',',xMasterID);
END IF;
SELECT MasterID
INTO xMasterID
FROM goods
WHERE ID=xMasterID;
END WHILE;
RETURN xRes;
END;




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

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

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



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