Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2009, 13:00   #1
iankov
Форумчанин
 
Регистрация: 04.01.2009
Сообщений: 188
По умолчанию Выбрать все элементы из ветки дерева MYSQL

Вот собственно структура такова:
id, parentid, ...
как обычно, parentid определяет к какой "ветке дерева" принадлежит текущая строка....
Ну и вот у меня есть такое дерево
tree(id=1)-
------sub1(id=2)
------sub2(id=3)
-----------sub21(id=4)
----------------sub211(id=8)
----------------sub212(id=9)
-----------sub22(id=5)
-----------sub23(id=6)
------sub3(id=7)
.....
Примерно так. Я хочу выбрать все элементы и подэлементы из ветки sub2(id=3). Если я сделаю так: SELECT * FROM table_name WHERE parentid=3 то выберуться элементы sub21, sub22, sub23. А мне нужно выбрать все, в том числе и sub211, sub212.
Какой тут будет запрос?

Последний раз редактировалось iankov; 12.04.2009 в 23:34.
iankov вне форума Ответить с цитированием
Старый 13.04.2009, 02:36   #2
koma_grusha
Редкий обитатель
Форумчанин
 
Аватар для koma_grusha
 
Регистрация: 08.04.2009
Сообщений: 170
Радость

Код:
DECLARE @tmp table(ID int, ParentID int, Name nvarchar(20))
DECLARE @id int, @parent int, @i int, @name varchar(20)
DECLARE Cur CURSOR LOCAL STATIC FOR SELECT ID, ParentID, Name FROM Table_name WHERE ParentID > 0
OPEN Cur
FETCH FIRST FROM Cur INTO @id, @parent, @name
WHILE @@FETCH_STATUS = 0
BEGIN
	SET @i = @parent
	WHILE @i > 3
		SET @i = ISNULL((SELECT ParentID FROM Table_name WHERE ID = @i), 0)
	IF @i = 3 
		INSERT INTO @tmp (ID, ParentID, Name) VALUES (@id, @parent, @name)
	
	FETCH NEXT FROM Cur INTO @id, @parent, @name
END
CLOSE Cur
DEALLOCATE Cur

SELECT * FROM @tmp
вот то что надо, надеюсь работа с курсором тебе знакома, если нет, то напиши - объясню. В целом суть такова, создаешь временную талицу tmp, затем по циклу прогоняешь свою таблицу по parent_id, до тех пор пока оно не станет меньше или равно 3, и если оно равно 3, то записываешь эту запись во временную таблицу. по окончании работы курсора просто выводишь данные с времянки
Мозг, хорошо устроенный, стоит больше, чем мозг, хорошо наполненный (Мишель Монтень)
koma_grusha вне форума Ответить с цитированием
Старый 14.04.2009, 15:36   #3
iankov
Форумчанин
 
Регистрация: 04.01.2009
Сообщений: 188
По умолчанию

Ох нифига себе, а простое решение в Mysql существует вообще?

Или единственное решение, это вручную проходить по всем веткам?

И еще меня терзают смутные сомнения в выше описанном коде по поводу загрузки сервера...
Не проще ли будет пробежаться по нужно ветке и сделать несколько простых запросов типа:
select * from content where parentid=3 а затем еще запрос select * from content where parentid=4 .... пройти по всей ветке дерева с запросами

Последний раз редактировалось iankov; 14.04.2009 в 15:40.
iankov вне форума Ответить с цитированием
Старый 14.04.2009, 22:10   #4
koma_grusha
Редкий обитатель
Форумчанин
 
Аватар для koma_grusha
 
Регистрация: 08.04.2009
Сообщений: 170
По умолчанию

такой вариант подойдет только для частного случая - существующего на данный момент, а если ты добавишь еще один вложенный уровень, то ты его не увидишь
хотя мой код тоже для частного случая, так как работает только с веткой Id = 3 (т.е. для 7 он не прокатит, если только вместо 3 не посылать определенную переменную, содержащую нужную ID), но он увидит любую вложенность

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

Последний раз редактировалось koma_grusha; 14.04.2009 в 22:17.
koma_grusha вне форума Ответить с цитированием
Старый 15.04.2009, 10:18   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

а что тольку автору вопроса даст теория, КАК ещё можно решить данную задачу.
ну, например, в Oracle есть мощнейший механизм
select start with ... connect by prior ...
Код:
select level l, t.* from obj_electr_shema_connect t
 start with t.s_obj_electr_shema_upper_id = 10000000071668
 connect by prior t.s_obj_electr_shema_lower_id = t.s_obj_electr_shema_upper_id
вот только автору вопроса надо в MySQL...

Цитата:
Сообщение от iankov
Ох нифига себе, а простое решение в Mysql существует вообще?
думаю, что нет.. ;(
тут либо крутить цикл, выбирая каждый раз новый уровень, ссылающийся на предыдущий (первый уровень задаётся), потом выборка тех, кто ссылается на результаты предыдущей выборки.

либо, искусствено ограничить количество выбираемых (по вложенности) уровней. Тогда можно состряпать SQL запрос... хотя... думаю, что он будет тоже не совсем простым..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.04.2009, 09:22   #6
Rekky
Форумчанин
 
Аватар для Rekky
 
Регистрация: 14.01.2009
Сообщений: 312
По умолчанию

Ну вот можно попробовать что-то вроде этого:
Select * from Table_name Where prnt_id in (
Select id From Table_name Where prnt_id=3) and prnt_id=3
Никому не поставить нас на колени! Мы лежали и будем лежать!
Rekky вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
QuickRep не все элементы отображаются при просмотре xxxsas Общие вопросы C/C++ 1 12.04.2009 08:33
как перебрать все элементы на форме? Аlex Общие вопросы C/C++ 1 07.02.2009 03:46
Составить программу которая будет сортировать все положительные элементы Wast Паскаль, Turbo Pascal, PascalABC.NET 1 22.12.2008 15:56
Если все элементы матрицы четные, вычислить их произведение. Misho0k Паскаль, Turbo Pascal, PascalABC.NET 7 20.05.2008 22:51
в начале все отрицательные, затем все положительные элементы в матрице motaro Паскаль, Turbo Pascal, PascalABC.NET 2 07.03.2008 19:16