|
Заблокирован
|
|||||||||||
Из двух запросов в один по заранее известным отношениям15.10.2013, 16:51. Показов 916. Ответов 6
Метки нет (Все метки)
Как пишет читатель в соседней теме "намучившись с fk" я выкосил все innodb прелести и завел таблицу с теми же основными полями которые применяются для хранения этих самых fk.
Состав прост как три копья: table_name, column_name, referenced_table_name, referenced_column_name substitute_column_name - самая мякотка, собственное примитивное изобретение. Благодаря которому в любую таблицу подставляются списками (типа enum) значения указанного поля из связанной таблицы. При поддержке ПО, конечно. Вторая фича, что легко построить запрос на объединение, это самоочевидно в перечисленных сущностях. Короче все шикарно за исключением особого случая - соединения таблиц N:N. В режиме подставновки списков все работает, но запросов получается два штуки, поскольку родитель ничего не знает о потомке, потомок ничего не знает о родителе и все идет через связывающую таблицу данные в которой не человекочитаемые. В общем вот два сгенеренных ПО запроса:
У меня идей нет. Может кто сталкивался и знает как.
0
|
|||||||||||
| 15.10.2013, 16:51 | |
|
Ответы с готовыми решениями:
6
Объединение двух запросов в один
Свод двух запросов в один (Access) |
|
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
|
|||||||||||
| 15.10.2013, 18:36 | |||||||||||
|
Тупо в лоб не подходит?
![]() Правда, MS SQL, но идея понятна:
1
|
|||||||||||
|
Заблокирован
|
|||||||||||
| 15.10.2013, 20:43 [ТС] | |||||||||||
|
Названия полей здесь вещь сугубо условная. Это могут быть любые, заранее неизвестные. Известны только отношения, поскольку они прописаны в таблице отношений. Теоретически признаком по которому надо вообще смотреть есть ли там отношение многие ко многим - это повтор того же самого имени в поле table_name. Но признак жидкий какой-то, я подумал что можно найти более жесткий.
И вообще, я похоже немного промахнулся. Надо было в PHP и базы данных, поскольку решение подразумевается процедурное. Тем не менее спасибо. Добавлено через 7 минут Да, идею вроде уловил, но выловить не могу. Вторая часть с union'ами на что-то полезное намекает, вроде. А, и еще, процедуры, в смысле "хранимки", реально использовать не могу, особенности хостинга (не льзя), но перевести на php смог бы, если бы понял смысл. Добавлено через 5 минут На самом деле было так. Я сделал поддержку списков и был удовлетворен, но как обычно внезапно захотелось вывести и слитно. Подумал "сейчас пропишу на все отношения готовый запрос, добавить еще поле пара пустяков" и прежде чем все сделал заметил что отношения и так уже прошиты. Более того, описанная таблица строится в модели nested set, то есть имеет ключи указывающие на иерархию. Я это не юзаю, но заложил на будущее. Не юзаю потому что опять-таки не осилил как соединять два или больше простых запросов в один. То есть кроме N:N еще может быть каноничный 1:N с несколькими join'ами, по глубине вложения. Которая вычисляется несусветным запросом, который я никогда в жизни сам бы не придумал. И вообще написав вполне годный класс для этой модели я так и не понял как она работает в целом. ![]() Добавлено через 7 минут Походу я запарился. Сейчас проверить не могу, но о идее достаточно выкинуть select ... from, то есть:
Добавлено через 5 минут Про fk отдельно, чтобы не плодить темы по пустякам. Чем объясняется логика каскадного удаления всех потомков при удалении родителя я так и не понял. Это же позднейшее изобретение в такой БД как файловая система - что можно удалить не пустую папку со всем ее барахлом. До него удалить можно было только файлы, а затем уже пустую папку (которая собственно файл). В том числе эта особенность лишила смысла применение fk. Нажав "удалить" я должен удалить потомка, проверить не сдохли ли все и только тогда удалять родителя. Если не сдохли - оставить родителя вживых дабы не плодить сирот. Я думал именно так работает упомянутое каскадное. Оказалось как "в винде 3.11"
0
|
|||||||||||
|
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
|
||||||
| 16.10.2013, 00:24 | ||||||
|
вообще как-то стрёмно задача поставлена... сгенерировать возможные запросы без учета конкретной необходимости в результатах...
Или я как обычно не понял))) Про FK - там скорее контроль существования элемента перед записью ссылки на него (ссылочная целостность), нежели каскадные операции. Хотя деталей MySQL я не знаю) выкинуть SELECT FROM не сработает в случае
0
|
||||||
|
Заблокирован
|
|||||||||||
| 16.10.2013, 19:15 [ТС] | |||||||||||
|
Задача такая. Есть БД и модель которая нарисована в той самой _table_references. Подразумевается что ни в каком месте скрипта не придется строить запросы по месту. Аргументы (пост или гет) шарашат в "роутер" который зная об устройстве БД строит по ним запрос. В нормальных 1 к многим отношениях все работает, а многие-ко-многим выпали из матки. Потому что получается не один, а два запроса. А надо один. А получается 2... Ну вот, найти закономерность сам не смог, решил задать вопрос.
Вспомнил про этот "роутер". Пользуясь случаем чтобы не плодить темы по пустякам. У него такой вот запрос:
0
|
|||||||||||
|
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
|
|
| 17.10.2013, 09:41 | |
|
в "роутер", ятд, должны передааться не 2 раза по 2 названия таблицы, а 1 раз 3 названия - тогда возможно сгенерировать все допустимые связи по трем таблицам. При этом формирование, имхо, проще разбить на 4 UNION, отслеживающих положение связывающей таблицы в полях _table_references, как я предложил ранее
Операция "=" имеет только 2 аргумента - левый и правый, так что без AND никак ![]() Если брать в скобки, то результат сравнения 0 или 1, что, в свою очередь, будет сравниваться с оставшейся частью - не то, что бы хотелось
0
|
|
|
Заблокирован
|
||||||||||||||||
| 17.10.2013, 22:36 [ТС] | ||||||||||||||||
|
Оказалось все так и ест. Надо только местами поменять корень и реф. Получается соединение наоборот, но зато получается. Было
Выкидываем силект фром и конец оператора:
И оно показывает. Интуиция не подвела. Теперь надо скрипт научить ее проявлять, то есть собирать из кучи силектов один. Я совсем забыл что есть у меня чудесная таблица на которой с полдюжины жирных списков висит. Соединилась по описанному сценарию. На четыре экрана по горизонтали прокрутка.
0
|
||||||||||||||||
| 17.10.2013, 22:36 | |
|
Помогаю со студенческими работами здесь
7
Обьединение двух JPQL запросов в один Данные двух запросов в один datagrid Из двух идентичных запросов работает один
Как из двух запросов сделать один вложенный Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|