Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> выборка из таблицы-дерева 
:(
    Опции темы
Pokoinik
Дата 7.12.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 17.3.2007
Где: /dev/null

Репутация: нет
Всего: 3



Есть таблица:
Код

CREATE TABLE `ceway_tree` (
  `id` int(11) NOT NULL auto_increment,
  `pid` int(11) NOT NULL default '0',
  `alias` varchar(255) collate utf8_bin NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=19 ;


id - ид элемента
pid - ид родителя в этой же таблице, если нет родителя pid=0

нужно зная ид узла выбрать все узлы составляющие путь к корню дерева...
уровень узла не известен...
желательно сделать используя минимальное количество запросов.

Это сообщение отредактировал(а) Pokoinik - 7.12.2007, 16:54


--------------------
ICQ: 490-993
Существует только 10 типов людей: те, которые понимают двоичную систему, и которые ее не понимают!!!
Опасайтесь людей верующих, ибо у них есть боги, которые им все прощают.

Делай или не делай! Никаких попробую!
Йода (Yoda), мастер-джедай
PM MAIL ICQ   Вверх
onsql
Дата 7.12.2007, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 3.12.2007

Репутация: нет
Всего: 3



Посмотри вот тут mysqlfaq - Common Queries
PM MAIL   Вверх
Pokoinik
Дата 7.12.2007, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 17.3.2007
Где: /dev/null

Репутация: нет
Всего: 3



onsql, данный пример мне не совсем подходит, так как у меня все узлы храняться в одной таблице, а переделывать возможности нет...


--------------------
ICQ: 490-993
Существует только 10 типов людей: те, которые понимают двоичную систему, и которые ее не понимают!!!
Опасайтесь людей верующих, ибо у них есть боги, которые им все прощают.

Делай или не делай! Никаких попробую!
Йода (Yoda), мастер-джедай
PM MAIL ICQ   Вверх
skyboy
Дата 7.12.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



тут только рекурсией. запросов столько, сколько уровней от текущего элемента до корня.

Добавлено через 4 минуты и 14 секунд
причем рекурсия на стороне клиента: получил родителя узла, потом получил родителя родителя и т.д..
PM MAIL   Вверх
Glip
Дата 10.12.2007, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 3
Всего: 18



http://www.sqlteam.com/article/more-trees-hierarchies-in-sql
вот тут кажется нечто похожее.
и на стороне сервера.

Это сообщение отредактировал(а) Glip - 10.12.2007, 17:11


--------------------
user posted image
PM MAIL   Вверх
SelenIT
Дата 15.12.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 6
Всего: 401



Можно в один запрос - с многократным LEFT JOIN-ом таблицы самой на себя. Только разбирать ответ, возможно, будет непросто (идея и примеры - здесь). И максимальная глубина ограничена 31 (в старых версиях) или 63 (MySQL 5) уровнями.


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Feldmarschall
Дата 15.12.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 3
Всего: 32



Я думаю, никаких проблем рекурсивная выборка не доставит.

Другое дело, что могут быть другие запросы, а не только вычисляющие путь. 
поэтому лично я считаю, что если количество узлов дерева превышает несколько десятков, то лучше использовать другие способы хранения деревьев в БД
PM   Вверх
SelenIT
Дата 15.12.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 6
Всего: 401



Цитата(Feldmarschall @  15.12.2007,  13:56 Найти цитируемый пост)
если количество узлов дерева превышает несколько десятков, то лучше использовать другие способы хранения деревьев в БД

Спорный тезис, имхо. Все-таки, по части гибкости (добавление/перенос/удаление ветвей, произвольность порядка сортировки ветвей при выводе) и надежности (при повреждении одной записи бьется лишь ее подветвь, а не все дерево) у списков смежности конкурентов мало. Кроме того, во многих реальных задачах так или иначе все равно требуется все дерево целиком - а оно элементарно и быстро строится одним запросом с последующим рекурсивным разбором массива...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Feldmarschall
Дата 15.12.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 3
Всего: 32



Ну так и я о том же. Несколько сотен уже не будешь каждый раз тягать. 
PM   Вверх
SelenIT
Дата 15.12.2007, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 6
Всего: 401



А почему бы и нет, собственно? У меня и с тысячей никогда проблем не было...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
vi_k
Дата 31.12.2007, 04:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 29.12.2007

Репутация: нет
Всего: нет



Функция рекурсивного поиска на стороне сервера самого верхнего предка, parent_id которого равен 0.
Если такой отсутствует, возвращает NULL. Легко можно переделать под задачу автора.

Код

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 ; 


Это сообщение отредактировал(а) vi_k - 31.12.2007, 05:00
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0520 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.