![]() |
|
Модераторы: skyboy |
![]()
|
|
| KEM |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 28.1.2005 Репутация: нет Всего: 2 |
День добрый! Давно не брался уже за sql, но вот встала задача. Бьюсь над ней уже ужасно долго, и никак не получается, а оч. надо.
И имеется таблица, с родительским отношением элементов. Нужно зная parent_id ребёнка найти всех его родителей. +----+-----------+----------------+ | id | parent_id | name | +----+-----------+----------------+ | 4 | 3 | name1 | | 7 | 4 | name2 | | 11 | 4 | name3 | | 14 | 11 | name4 | +----+-----------+----------------+ Например для name4, последовательность будет выглядеть так name4 -> name3 -> name1. Может есть у кого какие идеи ? Заранее благодарен. Это сообщение отредактировал(а) KEM - 1.11.2007, 19:05 --------------------
Мы растворяем сознание жизни, реальностью стал бешеный ритм... |
|||
|
||||
| KEM |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 152 Регистрация: 28.1.2005 Репутация: нет Всего: 2 |
Вот навоял запросик который выводит 2-х родителей от из весного ребёнка, новот как его сделать универсальным ? :wall:
Безусловно повторяя кусок
можно добраться до начала но это ни как не лучше повторов запроса в самом коде программы. Это сообщение отредактировал(а) KEM - 2.11.2007, 00:37 --------------------
Мы растворяем сознание жизни, реальностью стал бешеный ритм... |
||||
|
|||||
| JustNick |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 28.11.2006 Репутация: нет Всего: нет |
Одним запросом не получается, а вот процедуру можно создать, только доделать нужно - с циклом какая-то беда, но что-то вроде такого:
DELIMITER $$ DROP PROCEDURE IF EXISTS `import_data`.`Path_Proc` $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `Path_Proc`(i int, out @path varchar(150)) BEGIN set @isExist = true; SET @CurID = i; set @path = ''; while @isExist and not @path is null do if exists(select * from `import_data`.`new table` where `id` = @curID and not `Parent_ID` is null and `parent_id` in (select `id` from `import_data`.`new table`)) > 0 then select @path = trim(cast(CONCAT_WS(' ',ifnull(@path,''),concat('->',`name`)) as char(150))) from `import_data`.`new table` where id = @CurID; select @CurID = `Parent_ID` from `import_data`.`new table` where `id` = @curID; set @isExist = true; else set @isExist = false; end if; end while; return @path; END $$ DELIMITER ; |
|||
|
||||
| pompei |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: нет Всего: 6 |
Нужно ещё учесть чтобы вот такие данные:
+-----+-----------+------+ | id | parent_id | name | +-----+-----------+------+ | 123 | 123 | name | или | 1 | 2 | name | | 2 | 3 | name | | 3 | 1 | name | +-----+-----------+------+ Не приводили к зацикливанию Не пойму зачем это делать с помощью SQL, можно на стороне приложения например так:
Это сообщение отредактировал(а) pompei - 2.11.2007, 06:25 --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
| JustNick |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 28.11.2006 Репутация: нет Всего: нет |
Это кому как нравится. Мне например больше по душе выполнение максимума на сервере, а клиент получает результат. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |