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




MySQL.RU - Webboard



Вернуться
Вопрос для гуру.Выборка древовидной структуры (Евгений) 24/02/2005 - 16:36:37
      Re: Вопрос для гуру.Выборка древовидной структуры (Dinky) 24/02/2005 - 19:06:17
      Re: 2 Dinky (Евгений) 24/02/2005 - 20:25:00
      Re: 2 Dinky (Dinky) 24/02/2005 - 20:58:03
      Re: 2 Dinky (Евгений) 24/02/2005 - 21:35:23
      Re: 2 Dinky (DNick) 25/02/2005 - 01:28:11
      Re: 2 Dinky (Dinky) 25/02/2005 - 01:46:35
      Re: А не проще ли хранить путь целиком? (Dubrovsky) 25/02/2005 - 09:08:18
      Re: 2 DNick (Евгений) 25/02/2005 - 11:02:43
      Re: А не проще ли хранить путь целиком? (Евгений) 25/02/2005 - 11:06:23
      Re: А не проще ли хранить путь целиком? (Dubrovsky) 25/02/2005 - 15:27:00
      Re: А не проще ли хранить путь целиком? (Евгений) 25/02/2005 - 20:34:11
      Re: 2 DNick (Dinky) 25/02/2005 - 22:41:40
      Re: 2 DNick (Евгений) 26/02/2005 - 11:08:15
      Re: 2 Евгений (Dinky) 27/02/2005 - 07:19:19
      Re: поправка (2 Евгений) (Dinky) 27/02/2005 - 07:29:23
      Re: короче! (2 Евгений) (Dinky) 27/02/2005 - 07:42:16
      Re: короче! (2 Евгений) (Евгений) 27/02/2005 - 19:03:46
      Re: короче! (2 Евгений) (cooler13) 28/02/2005 - 00:34:16
      Re: короче! (2 Евгений) (Dinky) 28/02/2005 - 02:33:37
      Re: 2Dinky (2 Евгений) (Евгений) 28/02/2005 - 14:37:54

> Original message text:
> From: Евгений - 24/02/2005 - 16:36:37
> Subject:Вопрос для гуру.Выборка древовидной структуры
> -----------------
> Имеется таблица, в которой хранится некая древовидная структура, например, файловая система, состоящая из папок, которые, в свою очередь, могут содержать другие папки. Таблица состоит из полей
> ID - уникальный идентификатор папки
> Parent - идентификатор родительской папки
> Name - имя папки
> Level - уровень вложенности
>
> Пример:
> +----+--------+--------------------------+-------+
> ! ID ! Parent ! Name ! Level !
> +----+--------+--------------------------+-------+
> ! 1 ! 0 ! Soft ! 0 !
> ! 2 ! 1 ! OS ! 1 !
> ! 3 ! 1 ! Games ! 1 !
> ! 4 ! 1 ! Programming ! 1 !
> ! 5 ! 2 ! Linux ! 2 !
> ! 6 ! 2 ! Windows ! 2 !
> ! 7 ! 3 ! HalfLife ! 2 !
> ! 8 ! 3 ! Doom3 ! 2 !
> ! 9 ! 4 ! PHP ! 2 !
> ! 10 ! 4 ! MySQL ! 2 !
> +----+--------+--------------------------+-------+
>
> Эта таблица соответствует дереву
>
> Soft
> !
> +------------------+--------------+
> ! ! !
> OS Games Programming
> ! ! !
> +---+---+ +--+----+ +--+--+
> ! ! ! ! ! !
> Linux Windows HalfLife Doom3 PHP MySQL
>
> Задача: зная ID папки одним запросом получить "путь" к этой папке.
> Например, задав ID=8 получить след таблицу
>
> +----+--------+--------------------------+-------+
> ! ID ! Parent ! Name ! Level !
> +----+--------+--------------------------+-------+
> ! 8 ! 3 ! Doom3 ! 2 !
> ! 3 ! 1 ! Games ! 1 !
> ! 1 ! 0 ! Soft ! 0 !
> +----+--------+--------------------------+-------+
>
> Я попытался сделать это следующим образом
>
> SET @pID:=8;
> SELECT *,(@pID:=Parent) FROM mytable WHERE ID=@pID ORDER BY Level DESC;
>
> Но, почему-то, MySQL возвращает только одну строку:
>
> +----+--------+--------------------------+-------+
> ! ID ! Parent ! Name ! Level !
> +----+--------+--------------------------+-------+
> ! 8 ! 3 ! Doom3 ! 2 !
> +----+--------+--------------------------+-------+
>
> В чем ошибка?
> И возможно ли, в принципе, решить подобную задачу. Может есть идеи как по-другому реализовать структуру таблицы?
>
> Подскажите, пожалуйста.
>


From: Евгений - 24/02/2005 - 21:35:23
Subject:2 Dinky
-----------------
Признаю, был резок. Просто мне очень не понравился иронично-высокомерного тона твоего первого ответа.
Если ты думаешь, что я новичок в SQL, то ты ошибаешься. Я много работал с FireBird и MySQL.
Давай отвлечемся от личностей и без обид, хорошо?

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

Решение предложенное тобой очевидно, и оно автоматически приходит в голову любому более менее сообразительному программеру. Хотя я бы не использовал рекурсию, а написал бы так

function getPath($id)
{
while($id!=0)
{
$res = mysql_query("SELECT parent, name FROM mytable WHERE id=".$id);
$row=mysql_fetch_assoc($res);
$path[]=$row;
$id=$row['parent'];
}
return $path;
}

Но мне это решение не понравилось (речь идет о WEB-сервере, и очень не хочется в одном скрипте делать сотни запросов) и я полез на http://www.mysql.com в поисках альтернативного решения, набрел на переменные пользователя. Вот, маленький пример, если выполнить запрос, без инструкции WHERE
SELECT *, (@a:=Parent) AS VarA FROM mytable
То вернутся все записи таблицы, а в поле VarA будут значения из ПРЕДЫДУЩЕЙ отобранной записи (в первой строке будет NULL).
Это значит, что MySQL способен менять значения переменной пользователя в процессе выполнения запроса. Почему же он не может использовать это значение в условии WHERE? Вот в чем соль вопроса.





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

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

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



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