Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

Вернуться   Форум программистов > Web > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 19.05.2008, 09:52   #1
ADSoft
Профессионал
 
Регистрация: 25.02.2007
Адрес: Татарстан
Сообщений: 3,276
Репутация: 912

icq: 303-206-418
skype: ad-soft.info
По умолчанию Рекурсивный SQL запрос

Имеется MySQL, в ней таблица table реализующая структуру каталога с полями
id
sub_id
...
...
...
где id - уникальный идентификатор каждого элемента каталога
а sub_id - ссылка этого элемента на родительский элемент

как бы написать SQL запрос, который выдаст все элементы, которые "ниже"/"выше" заданного id ....
то есть все вложенные элементы/или наоборот...... подозреваю что это делать с помощью рекурсий... но как конкретно - не знаю....
Может кто что подскажет?
ADSoft вне форума   Ответить с цитированием
Старый 19.05.2008, 11:46   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
Репутация: 590
По умолчанию

ADSoft, уточните. Я бы сказал, что скорее не рекурсий, а суб-запросов, благо mysql, начиная с версии 4 с чем-то, их поддерживает, но целиком схему, которая нужна, по Вашему описанию не смог себе вообразить....
B_N вне форума   Ответить с цитированием
Старый 19.05.2008, 12:39   #3
ADSoft
Профессионал
 
Регистрация: 25.02.2007
Адрес: Татарстан
Сообщений: 3,276
Репутация: 912

icq: 303-206-418
skype: ad-soft.info
По умолчанию

Цитата:
Сообщение от B_N Посмотреть сообщение
ADSoft, уточните. Я бы сказал, что скорее не рекурсий, а суб-запросов, благо mysql, начиная с версии 4 с чем-то, их поддерживает, но целиком схему, которая нужна, по Вашему описанию не смог себе вообразить....
...возможно неверно выразился......точнее как сказать..... попробую....
Есть таблица элементов каталога, каждый элемент определятся полями Id - уникальным номером, и Sub_id - принадлежность к родителю (указывается id того элемента которому принадлежит....если корень то 0)
.... задача - при выборе элемента - найти все множество элементов принадлежащих ему и далее (как ветка дерева)/ ну и как частный случай - не принадлежащих......
вот тут подсказывают что как то через Distinct и INNER JOIN...а как конкретно низнаю
ADSoft вне форума   Ответить с цитированием
Старый 24.05.2008, 23:09   #4
Feniks_infinity
Новичок
 
Аватар для Feniks_infinity
 
Регистрация: 24.05.2008
Сообщений: 1
Репутация: 10
По умолчанию

не знаю как на счет MySQL, а в Oracle работает:

SELECT LPAD(' ', 2*LEVEL)|| sub_id
FROM table
START WITH id=....
CONNECT BY PRIOR id= sub_id;
->> выдает sub_id, принадлежащие выбранному id
Feniks_infinity вне форума   Ответить с цитированием
Старый 25.05.2008, 09:07   #5
ADSoft
Профессионал
 
Регистрация: 25.02.2007
Адрес: Татарстан
Сообщений: 3,276
Репутация: 912

icq: 303-206-418
skype: ad-soft.info
По умолчанию

Э..... выбрать все элемены у который sub_id = id не проблемма....
надо все деево выбрать! то есть и те элементы, которые в сою очередь ринадлежат sub_id ...итд итп....
я так уже понял чистым SQL не разобраться... поцедуры нада писать в самом API или создавать хранимые процедуры... которых в MySQL нет
ADSoft вне форума   Ответить с цитированием
Старый 02.06.2008, 16:55   #6
Domovoy
Форумчанин
 
Регистрация: 24.10.2007
Сообщений: 254
Репутация: 85
По умолчанию

Код:

  DECLARE @tree TABLE (id int, ParentID int, [level] int)
  DECLARE @level int
  SET @level = 0
  INSERT INTO @tree (id, ParentID, [level])
  VALUES(@idNode, @idNode, @level)
  WHILE 1 = 1
  BEGIN
	INSERT @tree (id, ParentID, [level])
	SELECT v.idNode, v.idParent, @level + 1
	FROM dbo.dbtree v
	  INNER JOIN @tree t ON t.id = v.idParent AND t.level = @level
       where V.idDBTree=@DBTreeID
	IF @@ROWCOUNT = 0 
         BREAK
	SET @level = @level + 1
  END
  select * from @tree

Думаю лутшего метода быть не может
Domovoy вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запрос ссылается на несвязанный с ним запрос kolebatel SQL, базы данных 0 11.06.2008 12:50
SQL запрос Uomo БД в Delphi 17 23.04.2008 14:12
Запрос Инночка БД в Delphi 2 23.04.2008 13:19
SQL запрос SERG1980 БД в Delphi 6 19.10.2007 23:03
SQL-запрос Elena БД в Delphi 3 17.05.2007 15:13


01:54.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru