Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Прошу помощи в составлении хитрого запроса / 25 сообщений из 29, страница 1 из 2
01.09.2014, 10:15
    #38733850
Fastereus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
Есть таблица в которой хранятся древовидные списки :

id(key)CaptionParent1ToyotaNULL2NissanNULL3FordNULL4Ractis15Yaris16Versa17Almera2 8Tiana29Focus310Kuga311Wagon312Disel1113Benz1114Gaz11

В дереве имеет вид :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Caption        ID
  Toyota      1
  Ractis         4
  Yaris          5
  Versa          6
Nissan        2
  Almera         7
  Tiana          8
Ford          3
  Focus          9
  Kuga           10
  Wagon          11
    Dizel            12
    Benz             13
    Gaz              14
Список может иметь не ограниченное количество вложений, самое главное что у верхушки Parent=NULL

Мне нужно зная ID любого элемента получить список его и его родителей (ветку)

Например ID=12 доложен вернуть результат

IDCaption12Dizel11Wagon3Ford


А ID=8 должен вернуть результат :
IDCaption8Tiana2Nissan


Табличка с машинами взята для примера :) вообще делаю систему прав доступа ...

На текущий момент есть скрипт на PHP который справляется с данной задачей, но он генерирует огромное количество запросов, и при частом вызове просто делает лишние телодвижения :(

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

Заранее благодарен ...
...
Рейтинг: 0 / 0
01.09.2014, 15:28
    #38734156
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
Fastereusс чего начатьНапример, с изменения структуры хранения данных.
Можно перейти на nested set. А можно просто добавить поле, где хранить материализованный путь.
...
Рейтинг: 0 / 0
01.09.2014, 15:36
    #38734169
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
...
Рейтинг: 0 / 0
02.09.2014, 02:37
    #38734476
Fastereus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
Нашел лишь такой ответ на хабре
авторВынужден огорчить пользователей mySQL – в этой СУБД придется рекурсию организовывать внешними по отношению к СУБД средствами, например на php (код приводить не буду, его публиковали не раз, например здесь, достаточно поискать по запросу “mySQL tree” и т.п.).
...
Рейтинг: 0 / 0
02.09.2014, 02:39
    #38734477
Fastereus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
Akina,

Менять не чего нельзя ...
...
Рейтинг: 0 / 0
02.09.2014, 06:35
    #38734506
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
FastereusНашел лишь такой ответ на хабре
авторВынужден огорчить пользователей mySQL – в этой СУБД придется рекурсию организовывать внешними по отношению к СУБД средствами, например на php (код приводить не буду, его публиковали не раз, например здесь, достаточно поискать по запросу “mySQL tree” и т.п.). Не читайте перед обедом советских газетхабра.
Хотя рекурсивных запросов и в самом деле нет, вполне можно обойтись "внутренними" средствами - хранимыми процедурами.
А если у вас не планируется перенос веток, то материализованный путь имхо будет лучшим решением.
...
Рейтинг: 0 / 0
02.09.2014, 06:36
    #38734507
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
FastereusМенять не чего нельзянельзя менять структуру или вообще ничего нельзя? т.е. даже хранимку свою добавить тоже нельзя?
...
Рейтинг: 0 / 0
02.09.2014, 16:51
    #38735209
Fastereus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
Сервак чуджой, доступ к процедурам не проверил .. но в принципе я не бумаю что юзание процедур сократит количество запросов, а получется тот же гемор что я на PHP нарисовал только в SQL... так что наверно вопрос снят, я просто не знал что нет рекурсии в муське, очень жаль ...
...
Рейтинг: 0 / 0
03.09.2014, 05:22
    #38735619
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
Fastereusа получется тот же гемор что я на PHP нарисовал только в SQLТолько в варианте с ХП это будет один запрос, который можно использовать везде а в пхп-варианте это будет N запросов в цикле, которые каждый раз придётся копипастить.
...
Рейтинг: 0 / 0
03.09.2014, 14:30
    #38736231
Fastereus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
Следующее было накидано налету, протестировано, провда не оптимизировано но на мой взгляд все весьма локонично вышло :
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
	/*
		Загружает и формирует массив прав по умолчанию

		=false в случае ошибки, или массив прав
	*/
	private function GetDefaultRights($level=arTop)
	{
		$Base=$this->Provider();//Создаём новый доступ к базе данных , потому как функция реляционная
		if($level==arTop) $lvl=' IS NULL';
			else $lvl="='".$level."'";
		//Получаем все права
		$Request="SELECT * FROM `".$this->TablePrefix."rights` WHERE `Parent`$lvl ORDER BY `ID`;";
		if(!$Base->Query($Request) || !$Base->NumRows() && $level==arTop)
		{
			$this->Error(__FUNCTION__,'0x100D',array($Base->GetError()));
			return false;
		}

		//Пустой массив
		$result=array();

		//Добавляем все элементы
		while($row=$Base->Row())
		{
			$access=$this->RightFromDB($row['Default']);//конвертируем представление базыданных в внутреннее.

			//Обрабатываем вложенные права
			$items=$this->GetDefaultRights($row['ID']);
			if(count($items))
			{
            	$result[$row['Caption']]=array("access"=>$access,"items"=>$items);
			}
			else
			{
				//Нет вложенных политик
				$result[$row['Caption']]=$access;
			}
		}
		return $result;
	}



В PHP нет проблем с рекурсией, ну и есть такая же работающая в обратном направлении принцип тот же
...
Рейтинг: 0 / 0
03.09.2014, 15:15
    #38736334
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
tanglirFastereusНашел лишь такой ответ на хабре
пропущено...
Не читайте перед обедом советских газетхабра.
Хотя рекурсивных запросов и в самом деле нет, вполне можно обойтись "внутренними" средствами - хранимыми процедурами.
А если у вас не планируется перенос веток, то материализованный путь имхо будет лучшим решением.

хотел этоже написать. :) пхп сообщетво делиться на две части, как и везде 80 20. 80 незнают даже склтольком, не говоря уже о определённой субд. вот и советуют что попало.

другое дело, если ТС будет организовывать обход дерева, тут бы сразу задуматься о памяти. обход надо организовывать обходя в глубь а не по горизонтали.
...
Рейтинг: 0 / 0
04.09.2014, 03:26
    #38736971
Fastereus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
Считаю что не важно как лиж бы работало, в моем случае сначало нужно написать около 25 классов а потом уже их оптимизировать, тем более чтопоследнее делается практически до бесконечности, про СУБД я и в правду не ГУРУ, но как видно это мой первый вопрос был и увы ответа на него нет ...
...
Рейтинг: 0 / 0
04.09.2014, 05:07
    #38736981
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
FastereusВ PHP нет проблем с рекурсиейа в мускле есть?
Fastereusэто мой первый вопрос был и увы ответа на него нет"нет"? простите, а что вы подразумеваете под "ответом"? неужели готовое решение?
...
Рейтинг: 0 / 0
04.09.2014, 12:36
    #38737359
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
FastereusСчитаю что не важно как лиж бы работало, в моем случае сначало нужно написать около 25 классов а потом уже их оптимизировать, тем более чтопоследнее делается практически до бесконечности, про СУБД я и в правду не ГУРУ, но как видно это мой первый вопрос был и увы ответа на него нет ...

тебе же написали - NS tree способ хранения дерева, оптимимальный при редких изменениях и частых выборках по типу - получить всех детей, получить всех родителей, получить всех братьев...итд
...
Рейтинг: 0 / 0
05.09.2014, 11:58
    #38738396
Fastereus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
NS tree = SAXX (если кто знает что называли так....)

tanglirFastereusВ PHP нет проблем с рекурсиейа в мускле есть?
Fastereusэто мой первый вопрос был и увы ответа на него нет"нет"? простите, а что вы подразумеваете под "ответом"? неужели готовое решение?

Думаю нет ...
FastereusНашел лишь такой ответ на хабре
авторВынужден огорчить пользователей mySQL – в этой СУБД придется рекурсию организовывать внешними по отношению к СУБД средствами, например на php (код приводить не буду, его публиковали не раз, например здесь, достаточно поискать по запросу “mySQL tree” и т.п.).


И да я бы хотел готовый ответ, ибо я например если отвечаю даю готовые ответы ... простите если не оправдал надежд ...
...
Рейтинг: 0 / 0
05.09.2014, 12:11
    #38738427
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
Fastereus,

mysql Recursive limit 255 (as set by the max_sp_recursion_depth variable) was exceeded for

Там, правда, от родителей к потомкам, но если вы не сумеете развернуть в обратную сторону, то какой смысл вообще что-то советовать?
Кстати, если дерево не очень глубокое, то и вариант ТСа(явно рекурсивный) вполне работоспособен.
...
Рейтинг: 0 / 0
06.09.2014, 11:59
    #38739273
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
при условии что у детки только один парент
Код: sql
1.
2.
SELECT @id as child_id,@id:=(SELECT Parent FROM table_p WHERE id=@id) as parent_id
FROM table_p,(SELECT @id:=12) as init
...
Рейтинг: 0 / 0
06.09.2014, 12:44
    #38739287
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
bochkovпри условии что у детки только один парент
Код: sql
1.
2.
SELECT @id as child_id,@id:=(SELECT Parent FROM table_p WHERE id=@id) as parent_id
FROM table_p,(SELECT @id:=12) as init


маленько поправлю
Код: sql
1.
2.
SELECT @id as child_id,@id:=(SELECT Parent FROM table_p WHERE id=@id LIMIT 1) as parent_id
FROM table_p,(SELECT @id:=12) as init
...
Рейтинг: 0 / 0
06.09.2014, 18:36
    #38739383
Fastereus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
bochkovbochkovпри условии что у детки только один парент
Код: sql
1.
2.
SELECT @id as child_id,@id:=(SELECT Parent FROM table_p WHERE id=@id) as parent_id
FROM table_p,(SELECT @id:=12) as init


маленько поправлю
Код: sql
1.
2.
SELECT @id as child_id,@id:=(SELECT Parent FROM table_p WHERE id=@id LIMIT 1) as parent_id
FROM table_p,(SELECT @id:=12) as init


Нет деток во первых много во вторых, вложенность хаотична по веткам , в одних 1 или две в других 8 или девять итераций ...

Ваш метод не прокатит, собственно я пришел к мнению что пока оставлю на ПХП функцию ... тем более что у меня система это делает один раз при входе пользователя и лишняя секунда не важна ...
...
Рейтинг: 0 / 0
06.09.2014, 23:47
    #38739554
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
Fastereus,
в этом запросе нет ограничений на вложенность,
хоть бы попробовал
...
Рейтинг: 0 / 0
07.09.2014, 15:58
    #38739808
Fastereus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
Я конечно попробую ... но только когда приеду с всеросийской стройки счас на Космодроме восточный, тут дела немного другие ...


Я не понял запроса увидел некторые не знакомые конструкции, попробую обязательно а еще до этого прочитаю как этодолжно работать , яж сказал что не БАЗИСТ йа ...
...
Рейтинг: 0 / 0
08.09.2014, 06:27
    #38740122
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
Fastereusдеток во первых многоbochkov писал о родителе, а не о детях
а запрос - неочевидный, да
из серии "обводим мускль вокруг пальца" :)
...
Рейтинг: 0 / 0
09.09.2014, 07:36
    #38741261
Fastereus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
tanglirFastereusдеток во первых многоbochkov писал о родителе, а не о детях
а запрос - неочевидный, да
из серии "обводим мускль вокруг пальца" :)
Еще раз уточну что базы данных не когда небыли моим коньком , вот страшные скалярные строкина CGI не вопрос а СУБД всегда мло сталкивались со мной, я приеду через 2 недели попробую сначала понять потом сделать ...
...
Рейтинг: 0 / 0
09.09.2014, 23:21
    #38742284
userlive
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
31.01.2020, 06:47
    #39920876
Fastereus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи в составлении хитрого запроса
bochkov, приветствую , хоть и куча лет прошла но тема опять всплыла в новь ... попробовал и вот результат :


child_id;parent_id;493;492;492;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;NULL;

Как видишь не работает :)

А вот так работает :
SET @child_id = '869';
SELECT @child_id AS `ID` , @child_id := (SELECT Owner FROM test_th_nodes WHERE `ID` = @child_id LIMIT 1) AS `Owner` FROM test_th_nodes WHERE @child_id IS NOT NULL;


ID;Owner;869;867;867;NULL;
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Прошу помощи в составлении хитрого запроса / 25 сообщений из 29, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]