powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Древесный запрос ( древовидный)
25 сообщений из 26, страница 1 из 2
Древесный запрос ( древовидный)
    #39566388
Фотография Fastereus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день всемогущий All,

Имею я таблицу типа :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
ID  OWNER  CAPTION
1     0          Библеотека
2     1          Научное
3     1          Художественное
4     1          Программирование
5     2          Строение космотса
6     2          Серные дыры
7     3          Потный Харри
8     4          Mysql для ЛАМиРОВ
9     4          Где спросить вопросы
10    4          Радости WEB и PHP

Эта таблица есть древовидный список вида :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
1     0          Библеотека
   2     1          Научное
      5     2          Строение космонавта
      6     2          Серные дыры
   3     1          Художественное
      7     3          Потный Харри
   4     1          Программирование
      8     4          Mysql для ЛАМиРОВ
      9     4          Где спросить вопросы
      10    4          Радости WEB и PHP

Скажем так база уже не хилая и будет увеличиваться и сильно и по этому поиск реализованный в ней методом функции уже стал сильно грузить базу ,можно ли осуществить поиск по такой базе одним запросом ,

То есть я например указываю стартовую ветку ID=2 и Like %C% и на выходе получаю ID 5,6 6

А если ID=1 и Like %а% то имею ID=1,2,5,6

Причем количество таких вложений на текущий момент может достигать 73 .... писалась все это много лет тому назад, как временное решение (научная хрень, анализ) под обещание что вот вот скоро будет СУПЕР ПО для этого и все будет круто, но 7 лет спустя все изменилось и теперь "решайте сами , пишите сами , денег нет но вы держитесь"... я сильно не знаток СУБД

Сейчас у меня в мускуле написана функция которая вызываться рекурсивно но при большой базе и большой итерации это реально занимает много времени ...


//Дайте мне компилятор ДНК и я починю мир (с)
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39566394
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39566408
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fastereus,

Как часто и как сильно изменяется эта таблица со временем?
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39566415
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И какова максимальная вложенность данных (количество уровней дерева) - текущая и прогнозируемая?
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39566416
Фотография Fastereus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina , нет изучу похоже мой случай ... что поиск не давал результатов..
miksoft , некоторые во сновном верхние разделы вечные .... ниже постоянно изменяются все зависитотрезультатов симуляции процесса , если ветка не привела к нужному она вообще вся удаляется
Akina , на текущий момент насчитал 73 , но в теории бесконечен ... у меня везде ТИП Int_32 так что им и ограничен
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39567161
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я в своей практике работы с деревьями в БД остановился на варианте с двумя таблицами:
В первой соответственно сами элементы, т.е. id, data
А во второй собственно иерархия:
Код: sql
1.
2.
3.
4.
5.
6.
table B {
   id     SERIAL,
   parentID BIGINT UNSIGNED NOT NULL,
   childID BIGINT UNSIGNED NOT NULL,
   relLevel INT UNSIGNED NOT NULL
}


Где parentID и childID ссылки на таблицу с элементами, а relLevel - уровень на котором данный элемент является потомком данному родителю.

И внесение узлов, удаление и перемещение сделаны процедурами. При вставке в таблицу с элементами, триггер вставляет в таблицу связности запись для созданного id: {id, id, 0}

Но это я тоже подчерпнул из ссылки которую тебе уже привели.
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39569332
Фотография Fastereus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак Akina спасибо за линк, много чего интересного правда с учетом того что SQL не моя специализация пришлось много и долго читать , в итоге я добрался до как бы готового решения : вот тут но оно не фига не работает :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE PROCEDURE fetch_subtree_ids2(
    IN base INT UNSIGNED,
    IN max_levels INT UNSIGNED
)
BEGIN
    DECLARE currlevel INT DEFAULT 1
Ответ MySQL: Документация

#1064 - У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около '' на строке 6
Читаю дальше ...


kormot, это не лучшее решение... на мой взгляд, остаётся вся та же самая сложность но еще и в две таблицы, мне нужно движение в любую сторону от родителя к потомку иобратно , например вот такой запрос свособен от ID дойти до верхнего уровня :
Код: sql
1.
2.
SET @child_id = 170
SELECT @child_id , @child_id := (SELECT Owner FROM fssm_th_nodes WHERE ID = @child_id LIMIT 1) FROM fssm_th_nodes WHERE @child_id IS NOT NULL


причем его результат можно использовать в другом запросе например через `ID` IN ...
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39569339
Фотография Fastereus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Закончил читать , ответа работающего так и не нашёл...
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39569369
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fastereus
Код: plaintext
#1064 - У вас ошибка в запросе.

Читать надо сначала документацию. Там рассказано, как делать ПРАВИЛЬНО - в том числе и про DELIMITER.
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39569376
Фотография Fastereus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina , я взял якобы готовый и рабочий пример из статьи , и он не заработал ...

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

Так вот вы делаете тоже самое ... если у вас есть знания и возможность , дайте верное решение , если еще и есть время в достаточном объёме то подробно поясните как это работает . и тогда благодарность вам будет... ибо перелопатив тонны споров на высшем уровне я НЕ ХРЕНА НЕ ПОНЯЛ, так как я уже упоминал выше что SQL для меня сильно не основное...

Вспоминаю вступительную фразу к одной книжке "прочтение данной книги целиком не сможет сделать вас программистом..."
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39569383
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fastereusибо перелопатив тонны споров на высшем уровне я НЕ ХРЕНА НЕ ПОНЯЛ
А я не зря сказал - сначала надо читать ДОКУМЕНТАЦИЮ!
CREATE PROCEDURE and CREATE FUNCTION Syntax
Вот не поленись посмотреть - особенно примеры. ЛЮБОЙ пример создания процедуры/функции, состоящей более чем из одного предложения, начинается заданием особого DELIMITER и завершается его восстановлением к стандартному. Потому что сервер в принципе не может определить, что завершается текущей точкой с запятой - отдельное выражение внутри процедуры или само CREATE PROCEDURE.

Fastereusя взял якобы готовый и рабочий пример из статьиОн готовый и рабочий. Только рассчитан не на тех, кто вообще ничего не знает - статья ни разу не учебник, где понятия и элементарные правила разжёвываются с нуля. Любой, кто хоть что-то знает и прочитал про создание процедур, знает, что примеры в статье НЕОБХОДИМО обрамлять соотв. обвязкой.

FastereusВспоминаю вступительную фразу к одной книжке "прочтение данной книги целиком не сможет сделать вас программистом..."Очень правильное утверждение. Особенно для случая, когда напрочь отсутствует желание.

Fastereusесли я вам расскажу что вы не верно селектируете вирусы в банках петри , и ткну вас в учебник по гинетике вам проще будет ?
Ну вообще-то по образованию я микробиолог. Так что селекция вирусов для меня не загадка. Да и в учебнике по генетике такая информация если и есть, то чисто обзорно, так что тыкать надо немного в другой учебник...
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39569411
Фотография Fastereus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina , все таки вы один из тех кто не дает рыбу но и не может научить пользоваться удочкой ... не самый плохой вариант конечно но не лучший ...

я уже писал , как нужно помогать , о том что у меня нет спец знаний я вам уже сказал ... я как бы микроэлектронщик и до вирусов или нетики мне в принципе тоже до фени это была цитата с одного из форумов... там так же человеку на простой вопрос про релаизацию ALU на ПЛИСе на 40 листов кидали умных фраз , после чего пришел порутчик ржевский и прекратил издевательство над человеком выдав пример и подробное описание логики...


Ладно подожду своего порутчика...
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39569460
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fastereusподожду своего порутчикаПока будете ждать - постарайтесь всё-таки сформулировать задачу (имеется-требуется, можно даже с примером данные-результат). Пока что это не сделано лишь приблизительно - есть какие-то обрывки, причём даже не примеров, а так, ощущения в словах...

Fastereusу меня нет спец знаний я вам уже сказал ... я как бы микроэлектронщик

Описываемая задача как-то далековата от микроэлектроники. Делается в порядке интереса? тогда я не понимаю столь явно выраженного нежелания осваивать знания, явно необходимые для своего хобби...
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39570070
Фотография Fastereus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina, как поставить задачу точнее чем в старт топике мне не ясно, требуется получить ID от родителя до всех потомков его ...


На моём хобби таких здачь нет, если в кратце идет исследование бактерий которые будут перерабатывать сточные воды , есть тонна пробирок в которых сидят эти бактерии при разных условиях . температуры среда и плюс еще каждой подливают какуюнибь химию , да еще и в разных концентрациях .подсовывают другие микро организмы ... короче тупое тестирование ... этот аппарат после анализа не спрашивай чего , будем считать что выхлопных газов отбактерий , дает какие то результаты , но самый глобальный зажим что имя файла имеет уникальный номер , если в кратце тотам просто порядковый номер анализа и число бит под 64 наверно а тои больше ...
но анализы на нём делают не только по этой программе аа еще по целой куче ...


дано уже меня попросили что то придумать я придумал базу для хранения дезультатов , с кратким описанием , потом попросили сделать её древо видной ибо оодни анализы вытикают из других .. сделал ... вобщем не видел я их кучу лет ... а теперь у них возникла задача (они в поле About писали краткие выводы по основным критериям анализа ну не знаю что тотипа САРС >30% че это мне не понятно но ни короче ццелую систему разработали) так вот им нужен поиск но не повсем элементам а начиная с какой то ветки ... и что я сейчас делаю , я делаю первый заапрос всех потомков в нем LIKE %....% потом вызываю эту же функцию для каждого из этих элементов , короче рекурсивный поиск ... про то что там оборудование и железо шлак я думаю итак ясно стоял бы там сервер как на моёмосновном месте работы с 8 процамипо 8 ядер и 512 гб оперативы и лезвием c скоростью работы сравнимым с лучшими SDD дисками , проблем бы не было а так переиодически PHP вываливается так как время выполнения скрипта привышает максимальное ...

Делаю я это бесплатно , ибо наука у нас бедная, они как бы и так работают и это их устраивает но хочется лучшего ...

p.s.:
Моё хобби это разработка промышленных PLC с последующей продаже разработок производителям , сейчас готовлю свой старт ап хочу попробовать сам производить и продавать ...

Работаю вообще в большой энергетике мелким начальником ...

И если еще честнее быть не когда не изуячал глубако SQL, потому что в моей сфере ему нет места ... а если бы изучал то не просил бы помощи... и если бы мог понять что надо обертку делать, не говорил бы что не знаю ... ну и так далее
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39570084
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fastereusкак поставить задачу точнее чем в старт топике мне не ясно
Ну хотя бы точно так же, как и пример исходных данных, показать условия отбора (текстом) и желаемый результат (таблицей). На ИМЕННО ЭТИХ данных и условиях. И с объяснением, почему именно так. И использовать при этом тег Table (поля разделять запятыми). И не забывать пользоваться кнопкой Просмотр, чтобы убедиться, что выглядит так, как задумано.
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39570085
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я верно понимаю, то требуется следующее: в дереве по заданному узлу найти его и всех его потомков, которые соответствуют указанному шаблону. Если так - решение в указанном FAQ есть. И не в одном экземпляре. Обычный поиск по слову "потомков" в теме их даёт. Например, FAQ: Древовидные структуры средствами MySQL или роман Стендаля "Красное и Черное", msg=13962137 Всего-то и надо, что к полученному списку потомков применить требуемый шаблон...
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39570120
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищ Fastereus , я как далеко-далеко не самый крутой спец на этом форуме вполне понимаю желание вопрошающего зачастую получить ответ как можно ближе к реализации, без необходимости изучать всё с азов.

Я всё же по своему варианту попробую выступить в защиту. Не вижу особых трудностей с нахождением хоть потомков, хоть родителей. Т.е. твои данные в моём представлении предполагают выглядеть так:
Таблица А
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
1     Библиотека
2     Научное
3     Художественное
4     Программирование
5     Строение космотса
6     Серные дыры
7     Потный Харри
8     Mysql для ЛАМиРОВ
9     Где спросить вопросы
10    Радости WEB и PHP



Таблица B
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
id     parentID    childID    relLevel
-----------------------------------------
1      1           1          0 /*Для каждого элемента запись с relLevel 0 - "указатель на себя" */
2      2           2          0
3      1           2          1 /*Элемент с id=2 является потомком первого уровня элемента с id=1*/
4      5           5          0
5      2           5          1 /*Элемент с id=5 является потомком 1-го уровня элемента с id=2*/
6      1           5          2 /*Элемент с id=5 является потомком 2-го уровня элемента с id=1*/
......................
......................



В твоей однотабличной схеме я так понимаю кроме рекурсии никак не решить задачу с поиском потомков и родителей, а это дело затратное. В моей схеме избыточность данных, но плюсом - скорость поиска.

А никаких дополнительных трудностей с двухтабличной схемой нет. Тригером при добавлении в А создаётся запись "сам на себя" в В.
И процедурами создаётся/изменяется подчинённость узлов.
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39570127
Фотография Fastereus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina, Это про текстовые индексы ? процитируй ПЖСТ что ты считаешь ответом , я выше процитировал что я посчитал ответом но оно не заработало , потому что его надо "обернуть" , в ответ на как , я был отправлен к мануалу. причем к тому разделу манула который совершенно бесполезно читать с середины... в общем рекурсия вышла ...

kormot, в выше упомянутой Akina статье описаны все минусы вашего метода, но и даже с учетом того что там описано мне придется перелопатить тонну кода, причем большую часть которого уже сильно давно писал и не только я... нежели добавить всего одну функцию поиска ... я молчу про конвертацию базы и заного прикручивание к ней данных анализатора... меня постигает печалька только примыслях об этом , а еще и возможные косяки и то что этовсе придется делать в онлайне наживой базе ... в общем тут нет однозначно , но за ответ спасибо ...
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39570183
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fastereusнадо "обернуть" , в ответ на как , я был отправлен ...
прочитать про DELIMITER. Как успехи?
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39570226
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FastereusЭто про текстовые индексы ? процитируй ПЖСТ что ты считаешь ответомКакие нах текстовые индексы? ты чем смотришь? Я специально дал ссылку на конкретный постинг. У него даже заголовок тебе специально зелёным выделен.
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39571139
Фотография Fastereus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina, Так , он в строку ... выходит . Возвращается одна строка одно поле в место списка, как это сунуть в таблицу ? для дальнейшего использования
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39586160
Фотография Fastereus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем решение так и не было найдено ... ладно что же пусть по прежнему PHP трудится над этой проблемой
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39604490
Фотография Fastereus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наткнулся на проблему которую не могу совершенно понять , я в общем эксперементировал в консоли и в phpmyadmin и запрос :
Код: sql
1.
2.
SET @child_id = '170';
SELECT @child_id AS `ID` , @child_id := (SELECT Owner FROM fssm_th_nodes WHERE `ID` = @child_id LIMIT 1) AS `Owner` FROM fssm_th_nodes WHERE @child_id IS NOT NULL;



прекрасно работает , но при попытке сунуть его в mysqli_query() сносит моск :
Код: sql
1.
2.
3.
4.
#1064 : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@child_id = '170'; SELECT @child_id AS `ID` , @child_id := (SELECT Owner FROM f' at line 1

 
при выполнении запроса [@child_id = '170'; SELECT @child_id AS `ID` , @child_id := (SELECT Owner FROM fssm_th_nodes WHERE `ID` = @child_id LIMIT 1) AS `Owner` FROM fssm_th_nodes WHERE @child_id IS NOT NULL;



Убейте не могу понять в чем засада ???? этот же запрос спокойно выполняется с консоли
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39604513
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fastereusв чем засада ????Наверное, в том, что mysqli_query() не понимает мультизапросов. перемести инициализацию переменной в секцию FROM.
...
Рейтинг: 0 / 0
Древесный запрос ( древовидный)
    #39604540
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fastereus,
не вникал в ветку, а чем NESTED SETS не идёт?
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Древесный запрос ( древовидный)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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