powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Можно ли сделать рекурсию в SQL-запросе?
21 сообщений из 21, страница 1 из 1
Можно ли сделать рекурсию в SQL-запросе?
    #39688435
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Схема упрощенная, но в целом так:
Есть таблица "карточка груза", характеризующая груз и его движение. Данная карточка может быть типа "автомобиль", "вагон" и "склад".
Поля, скажем, такие:
Код: sql
1.
2.
3.
4.
5.
id;
id_поставки - откуда пришел груз (ссылка на такую же карточку);
тип ('auto', 'wagon', 'placement');
id_автомобиля или id_вагона или id_склада;
вес груза;


Например, какой-то груз приехал автомобилем, затем переместился на склад. Требуется определить транспорт, на котором прибыл груз. Это просто - имеем карточку груза на складе, обращаемся к полю id_поставки (это ссылка на такую же карточку) и смотрим ее тип - 'auto'. По полю id_автомобиля определяем автомобиль.
Но ситуация усложняется, если груз несколько раз перемещали со склада на склад, соответственно, образуется цепочка карточек, где первой будет карточка автомобиля, затем несколько карточек склада до последней. А нужно определить автомобиль, которым прибыл груз изначально. И вот нужно раскрутить всю цепочку, пока не встретишь транспортное средство.

Можно ли это сделать с помощью хранимой функции или процедуры? И как совместить вызов процедуры внутри SQL-запроса, если например там список карточек склада, и нужно вывести список транспортных средств для них - какие-то определятся сразу, а другие нужно вытаскивать через рекурсию, и выдать это все одним списком.
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39688442
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри вот это

7488767
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39688451
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не помешал бы уникальный ид груза. А если id карточки автоинкрементный (позволяет сортировать карточки в порядке перемещения), задача становится тривиальной.
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39688453
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183,

сразу скажу, на самом деле структура немного посложнее, чем дерево родитель-потомок. На одну карточку склада может приходить много карточек вагонов и авто. Т.е. структура не один-ко-многим, а многие-ко-многим, где существует 3 таблицы:
карточка1
карточка2
таблица_взаимосвязи (ссылка_на_карточку_1_id, ссылка_на_карточку_2_id).
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39688455
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39688457
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladсразу скажу, на самом деле структура немного посложнее, чем дерево родитель-потомок. На одну карточку склада может приходить много карточек вагонов и авто.

Ну так ты сначала выведи цепочку cargo_card
А потом уже смотри какие ТС принимали участие в членах этой цепочки.


Структуру первичной информации ты дал.
Кода нарисуешь структуру необходимого отчета, то и тебе станет понятней.
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39688458
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladА нужно определить автомобиль, которым прибыл груз изначально.
Ну так для этого сначала надо определить первое cargo_card этого груза.
svnvladИ вот нужно раскрутить всю цепочку, пока не встретишь транспортное средство.

А вот это непонятно. Бывают грузы без ТС?
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39688469
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladнужно раскрутить всю цепочку, пока не встретишь транспортное средство.Реализация зависит в первую очередь от версии сервера. Если это 8+ - то повезло, он поддерживает рекурсивные CTE, и можно всё реализовать одним запросом. Если нет - только хранимая процедура.
svnvladМожно ли это сделать с помощью хранимой функции или процедуры?Да, можно. Только процедурой. Функции в MySQL не могут быть рекурсивными.
svnvladкак совместить вызов процедуры внутри SQL-запроса, если например там список карточек склада, и нужно вывести список транспортных средств для них - какие-то определятся сразу, а другие нужно вытаскивать через рекурсию, и выдать это все одним списком.Процедуру нельзя использовать в качестве источника данных запроса. Её можно использовать только как самостоятельный запрос - получат от неё готовый набор записей либо формировать в ней (временную) таблицу с подготовленными данными, которые затем использовать в запросе. Чаще используется первый подход.
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39688471
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183svnvladА нужно определить автомобиль, которым прибыл груз изначально.
Ну так для этого сначала надо определить первое cargo_card этого груза.
svnvladИ вот нужно раскрутить всю цепочку, пока не встретишь транспортное средство.

А вот это непонятно. Бывают грузы без ТС?
Бывают грузы, перемещаемые со склада на другой склад. Но изначально на первый склад он приезжает транспортным средством. Нужно раскрутить до самого начала, на каком транспортном средстве он попал на первый склад.
Нужно, чтобы в верхней сетке были карточки склада, а в нижней - detail - список транспортных средств, которыми этот груз прибыл. Отображаться должен не предыдущий склад, а именно транспорт. Хотя по структуре склад равноценен транспорту.
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39688485
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183svnvladсразу скажу, на самом деле структура немного посложнее, чем дерево родитель-потомок. На одну карточку склада может приходить много карточек вагонов и авто.

Ну так ты сначала выведи цепочку cargo_card

Вопрос в том и состоит, как вывести (раскрутить) эту цепочку. Это рекурсия.
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39688492
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суть задачи такова: на картинке прямоугольник "Входящие ТС" - отобразить транспортные средства. Не то же самое, что "Входящие источники".
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39688515
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladВопрос в том и состоит, как вывести (раскрутить) эту цепочку. Это рекурсия.

982183Посмотри вот это
7488767
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39688530
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То, что ты называешь "карточка груза"
скорее всего есть "этап доставки"

Соответственно тебе нужно имея на входе запроса конечный "этап доставки"/"карточка груза"
т.е cargo_card.id
Получить все предшествующие id из transhipment.from_cargo_card_id
А потом подцепить характеристики транспорта из соответствующих таблиц.
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39688534
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Другое дело, что на этапах происходит объединение и очевидно разъединение партий.
Понятие "номенклатура" я у тебя не вижу.
И как это реализовано - пока не понимаю.
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39688546
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На последней картинке ты решаешь задачу
"какие транспорта участвовали в доставке", а не тот транспорт который был в первом этапе
авторА нужно определить автомобиль, которым прибыл груз изначально

В любом случае надо сначала определить список этапов, а потом подобрать транспорта из соответствующих таблиц.
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39688611
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183,

карточка груза - это таблица cargo_card на желтой схеме. Упоминание о самой номенклатуре груза идет через поле contract_cargo_sub_id - там длинная связка таблиц, которая в конце концов приводит к cargo_nomenclature. Но это не важно. Так же как и какой транспорт. Весь вопрос - как организовать технически рекурсию cargo_card.id -> trasshimpent.to_cargo_card_id -> transshipment.from_cargo_card_id -> cargo_card.id -> trasshimpent.to_cargo_card_id -> transshipment.from_cargo_card_id -> и т.д.
До тех пор, пока не будет cargo_card.object_type IN ('auto', 'wagon').
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39688612
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183svnvladВопрос в том и состоит, как вывести (раскрутить) эту цепочку. Это рекурсия.

982183Посмотри вот это
7488767
Это я пробежал, там же описывается для случая дерева, когда один родитель и много наследников. А здесь наоборот, скорее, много родителей и несколько наследников (многие-ко-многим). Хотя попробую, конечно, те процедуры адаптировать для многих-ко-многим.
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39688901
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladА здесь наоборот, скорее, много родителей и несколько наследников (многие-ко-многим).
авторсразу скажу, на самом деле структура немного посложнее, чем дерево родитель-потомок. На одну карточку склада может приходить много карточек вагонов и авто. Т.е. структура не один-ко-многим, а многие-ко-многим, где существует 3 таблицы:
Нет у тебя многие-ко-многим в описываемом процессе.

авторкарточка1
карточка2
таблица_взаимосвязи (ссылка_на_карточку_1_id, ссылка_на_карточку_2_id).

Рассматривай таблицу связей как единственную таблицу, описывающую иерархию.
Возможно перевернутую (если я правильно понял)
(если у тебя есть объединение партий)
Если есть и разукомплектовка партий, то да, есть многие ко многим.
Но из второй картинки это не следует.

А таблицу "карточек" и ТС как дополнительные двухуровневые справочники.
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39689186
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А рекурсия обсуждалась вот тут:

21273292
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39697617
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladМожно ли это сделать с помощью хранимой функции или процедуры?

Можно, с помощью процедуры.

авторИ как совместить вызов процедуры внутри SQL-запроса, если например там список карточек склада, и нужно вывести список транспортных средств для них - какие-то определятся сразу, а другие нужно вытаскивать через рекурсию, и выдать это все одним списком.

Пишешь процедуру, в ней готовишь все данные, потом выводишь.
...
Рейтинг: 0 / 0
Можно ли сделать рекурсию в SQL-запросе?
    #39697713
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМожно ли сделать рекурсию в SQL-запросе?
https://dev.mysql.com/doc/refman/8.0/en/with.html
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Можно ли сделать рекурсию в SQL-запросе?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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