powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Прошу помощи в составлении хитрого запроса
25 сообщений из 29, страница 1 из 2
Прошу помощи в составлении хитрого запроса
    #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
Прошу помощи в составлении хитрого запроса
    #38734156
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fastereusс чего начатьНапример, с изменения структуры хранения данных.
Можно перейти на nested set. А можно просто добавить поле, где хранить материализованный путь.
...
Рейтинг: 0 / 0
Прошу помощи в составлении хитрого запроса
    #38734169
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Прошу помощи в составлении хитрого запроса
    #38734476
Фотография Fastereus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел лишь такой ответ на хабре
авторВынужден огорчить пользователей mySQL – в этой СУБД придется рекурсию организовывать внешними по отношению к СУБД средствами, например на php (код приводить не буду, его публиковали не раз, например здесь, достаточно поискать по запросу “mySQL tree” и т.п.).
...
Рейтинг: 0 / 0
Прошу помощи в составлении хитрого запроса
    #38734477
Фотография Fastereus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Менять не чего нельзя ...
...
Рейтинг: 0 / 0
Прошу помощи в составлении хитрого запроса
    #38734506
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FastereusНашел лишь такой ответ на хабре
авторВынужден огорчить пользователей mySQL – в этой СУБД придется рекурсию организовывать внешними по отношению к СУБД средствами, например на php (код приводить не буду, его публиковали не раз, например здесь, достаточно поискать по запросу “mySQL tree” и т.п.). Не читайте перед обедом советских газетхабра.
Хотя рекурсивных запросов и в самом деле нет, вполне можно обойтись "внутренними" средствами - хранимыми процедурами.
А если у вас не планируется перенос веток, то материализованный путь имхо будет лучшим решением.
...
Рейтинг: 0 / 0
Прошу помощи в составлении хитрого запроса
    #38734507
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FastereusМенять не чего нельзянельзя менять структуру или вообще ничего нельзя? т.е. даже хранимку свою добавить тоже нельзя?
...
Рейтинг: 0 / 0
Прошу помощи в составлении хитрого запроса
    #38735209
Фотография Fastereus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сервак чуджой, доступ к процедурам не проверил .. но в принципе я не бумаю что юзание процедур сократит количество запросов, а получется тот же гемор что я на PHP нарисовал только в SQL... так что наверно вопрос снят, я просто не знал что нет рекурсии в муське, очень жаль ...
...
Рейтинг: 0 / 0
Прошу помощи в составлении хитрого запроса
    #38735619
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fastereusа получется тот же гемор что я на PHP нарисовал только в SQLТолько в варианте с ХП это будет один запрос, который можно использовать везде а в пхп-варианте это будет N запросов в цикле, которые каждый раз придётся копипастить.
...
Рейтинг: 0 / 0
Прошу помощи в составлении хитрого запроса
    #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
Прошу помощи в составлении хитрого запроса
    #38736334
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirFastereusНашел лишь такой ответ на хабре
пропущено...
Не читайте перед обедом советских газетхабра.
Хотя рекурсивных запросов и в самом деле нет, вполне можно обойтись "внутренними" средствами - хранимыми процедурами.
А если у вас не планируется перенос веток, то материализованный путь имхо будет лучшим решением.

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

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

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

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

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


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

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

Там, правда, от родителей к потомкам, но если вы не сумеете развернуть в обратную сторону, то какой смысл вообще что-то советовать?
Кстати, если дерево не очень глубокое, то и вариант ТСа(явно рекурсивный) вполне работоспособен.
...
Рейтинг: 0 / 0
Прошу помощи в составлении хитрого запроса
    #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
Прошу помощи в составлении хитрого запроса
    #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
Прошу помощи в составлении хитрого запроса
    #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
Прошу помощи в составлении хитрого запроса
    #38739554
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fastereus,
в этом запросе нет ограничений на вложенность,
хоть бы попробовал
...
Рейтинг: 0 / 0
Прошу помощи в составлении хитрого запроса
    #38739808
Фотография Fastereus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я конечно попробую ... но только когда приеду с всеросийской стройки счас на Космодроме восточный, тут дела немного другие ...


Я не понял запроса увидел некторые не знакомые конструкции, попробую обязательно а еще до этого прочитаю как этодолжно работать , яж сказал что не БАЗИСТ йа ...
...
Рейтинг: 0 / 0
Прошу помощи в составлении хитрого запроса
    #38740122
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fastereusдеток во первых многоbochkov писал о родителе, а не о детях
а запрос - неочевидный, да
из серии "обводим мускль вокруг пальца" :)
...
Рейтинг: 0 / 0
Прошу помощи в составлении хитрого запроса
    #38741261
Фотография Fastereus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirFastereusдеток во первых многоbochkov писал о родителе, а не о детях
а запрос - неочевидный, да
из серии "обводим мускль вокруг пальца" :)
Еще раз уточну что базы данных не когда небыли моим коньком , вот страшные скалярные строкина CGI не вопрос а СУБД всегда мло сталкивались со мной, я приеду через 2 недели попробую сначала понять потом сделать ...
...
Рейтинг: 0 / 0
Прошу помощи в составлении хитрого запроса
    #38742284
userlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Прошу помощи в составлении хитрого запроса
    #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
25 сообщений из 29, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Прошу помощи в составлении хитрого запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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