|
MySQL.RU - Webboard
Вернуться
Выборка древовидной структуры (Евгений) 28/02/2005 - 14:36:34
Re: Выборка древовидной структуры (Dinky) 01/03/2005 - 00:17:57
Re: Выборка древовидной структуры (Евгений) 01/03/2005 - 03:08:05
Re: Выборка древовидной структуры (Евгений) 01/03/2005 - 03:13:02
Re: Выборка древовидной структуры (Евгений) 01/03/2005 - 03:16:04
Re: Выборка древовидной структуры (Валентин) 01/03/2005 - 13:19:02
Re: Выборка древовидной структуры (Dinky) 01/03/2005 - 19:54:01
Re: Выборка древовидной структуры (Евгений) 02/03/2005 - 13:17:39
Re: Выборка древовидной структуры всей (Валентин) 02/03/2005 - 13:41:07
Re: Выборка древовидной структуры всей (Евгений) 02/03/2005 - 16:01:09
Re: Выборка древовидной структуры всей (Валентин) 02/03/2005 - 16:17:29
Re: Выборка древовидной структуры всей (Евгений) 02/03/2005 - 17:10:13
> Original message text:
> From: Евгений - 28/02/2005 - 14:36:34
> Subject:Выборка древовидной структуры
> -----------------
> По просьбам "телезрителей" описываю способ, как одним запросом получить путь к заданному объекту в дереве :). Этот способ пришел мне в голову сразу после первого же поста, но я до самого конца надеялся, что это можно сделать изящнее, с помощью переменных пользователя, увы не получилось. Итак.
>
> Есть таблицу с древовидной структурой Tree.
> Поля таблицы Tree:
> ID (целое) - идентификатор объекта
> ParentID (целое) - идентификатор "родителя", если верхний уровень, то 0
> Level (целое) - уровень объекта, самый верхний - 0, делее 1,2....
> Path (строка) - самое интересное :) список идентификаторов ВСЕХ родителей через запятую (например 23,15,46,12). Порядок в списке особо не важен
>
> Запрос пути:
> SELECT .... FROM Tree WHERE FIND_IN_SET(ID,ObjPath) ORDER BY Level
>
> ObjPath - поле Path обекта, путь к котрому надо найти. Если известен только ID объекта, тогда придется сделать два запроса
>
> SELECT @ObjPath:=Path FROM Tree WHERE ID=ObjID;
> SELECT .... FROM Tree WHERE FIND_IN_SET(ID,@ObjPath) ORDER BY Level;
>
> В результате получим таблицу - список родителей начиная с самого верхнего, заканчивая самым последним.
> Для автоматического формирования полей Level и Path при вставке(переименовании, удалении) можно использовать триггеры или, как это сделал я, написать код в языке программирования.
>
> Воть. Ничего особенного в этом способе нет. Как выяснилось позже, этот способ давно найден и успешно эксплуатируется. А я его повторно "открыл". Вывод - надо лучше искать в Интернете :).
>
> P.S. А может есть способ проще? :)
>
From: Евгений - 02/03/2005 - 16:01:09
Subject:Выборка древовидной структуры всей
-----------------
Это довольно непростая задача. Для общего случая, с неограниченной вложенностью и неограниченным числом записей, тривиального способа, видимо, не существует.
Что надумал я. Возникают проблемы с сортировкой.
Относительно легко вывести такое дерево в порядке возрастания ID.
Для этого список ID в поле Path должен быть упорядочен (от родителя к детям) и в конце должен содержать также свой собственный ID (вроде поле Path по другому и не сделаешь :)). Кроме этого все ID должны иметь одинаковую ширину (дополнены слева нулями, в MySQL функция LPAD).
пример:
ID PATH
1 001
2 001,002
3 001,003
4 001,002,004
5 001,003,005
..........
105 023,015,105
106 001,002,106
После этого достаточно сделать выборку с сортировкой по полю Path.
Если же нужно отсортировать по какому либо другому признаку (например дате) все сильно усложняется.
Можно комбинировать методы. Например метод так называемых "вложенных множеств" (http://detail.phpclub.net/article/db_tree) легко справляется с этой задачей, но вносить изменения в такое дерево гораздо сложнее. Надо искать компромисс :)
[Это сообщение - спам!]
Последние сообщения из форума
Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
20526
|
|