| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Составление SQL-запросов > Динамические поля - в одно поле |
| Автор: SkyHawk 15.2.2016, 09:22 |
| Ребята, помогите! В mySQL имеются три таблицы. В первой - сущности с основными полями (ID заявки, автор, ответственный, дата создания заявки, и т.д.). ID author responsible date ----------------------------------------------------- 1 Иванов Петров 11.02.2016 2 Сидоров Тарасенко 05.11.2015 3 Васильев Петров 17.02.2015 Во второй - названия динамических полей (например, цвет текста, цвет фона, длина, ширина). ID property comment ----------------------------------------- 8 bg-color Цвет фона 9 text-color Цвет текста 10 width Длина 11 heigth Ширина В третьей - значения этих самых полей для каждой сущности, у каждой сущности из первой таблицы - то есть у каждой заявки - могут быть различное количество и различные значения этих полей. ID ticket-ID prop-ID value ------------------------------------------- 1 2 11 3 2 1 8 #ff0000 3 3 8 #caf8ee 4 1 10 4 Так вот, задача - запросом свести воедино, в одну таблицу, статические (из первой таблицы) и динамические (из второй и третьей таблиц) названия и значения полей. ID Автор Ответственный Дата Длина Ширина Цвет текста Цвет фона ------------------------------------------------------------------------------------------------------------------ 1 Иванов Петров 11.02.2016 4 #ff0000 2 Сидоров Тарасенко 05.11.2015 3 3 Васильев Петров 17.02.2015 #caf8ee Надеюсь, понятно объяснил. Никак не могу сообразить, как это реализовать одним запросом. Прошу сильно не пинать, в SQL я не гуру. |
| Автор: Akina 15.2.2016, 12:55 |
| Либо построить статический текст запроса, учитывающий ВСЕ возможные типы "динамических полей" (на самом деле - необязательных атрибутов), либо строить текст такого запроса динамически. Выходом мог бы быть перекрёстный запрос, но в MySQL они не реализованы. Впрочем, непонятно, что это за задача такая - "свести воедино". Ну, допустим, свёл - дальше что? показать на экране? использовать как источник данных другого запроса? что-то ещё? Это не задача, а первый этап решения какой-то задачи, тут не озвученной. И не факт, что путь решения той самой неозвученной задачи выбран правильно. |
| Автор: SkyHawk 15.2.2016, 13:00 |
| Akina, всё правильно, это часть другой задачи, цель этой подзадачи - создать источник данных для формирования отчёта по заявкам - xls-таблица, которая будет формироваться именно в указанном выше виде (см. результирующая таблица). Реализовать надо именно через mySQL, без PHP, js, и т.д., потому что использоваться будет в BI-системе, в которой источники данных формируются визуально из существующих таблиц (и при формировании отображается SQL-запрос, который будет выполняться). |
| Автор: Akina 15.2.2016, 13:12 |
| Ну а я что говорю? так себе путь решения выбран... Выгружай данные в Excel в том виде, в каком они присутствуют в таблицах, собрав в одну плоскую таблицу, на приведённых данных это будет ID author responsible date property value ----------------------------------------------------- 1 Иванов Петров 11.02.2016 Длина 4 1 Иванов Петров 11.02.2016 Цвет фона #ff0000 2 Сидоров Тарасенко 05.11.2015 Ширина 3 3 Васильев Петров 17.02.2015 Цвет фона #caf8ee А потом уже средствами Excel строй требуемый ПЕРЕКРЁСТНЫЙ отчёт. |
| Автор: SkyHawk 15.2.2016, 13:47 |
| Akina, спасибо! Буду думать... |
| Автор: SkyHawk 15.2.2016, 14:47 | ||
Дабы не задействовать клиентскую сторону (.xls), решил вопрос вот как: так как виды полей - поля в таблице хоть и динамические, но имеющие конкретные ID-шники, которые меняться не будут, создал запрос с несколькими LEFT JOIN, и с выборкой по конкретным ID-шникам.
Костыль блин, кривоватый костыль, но проблема решилась. |
| Автор: Akina 15.2.2016, 15:08 |
| Обязательно наложи на EAV-таблицу требование уникальности пары (ticket-ID,prop-ID), а то будет тебе щастье с таким костылём... |
| Автор: SkyHawk 16.2.2016, 07:04 |
| Akina, увы, непосредственно мне данная таблица доступна лишь на чтение... :( |
| Автор: Akina 16.2.2016, 09:01 |
| Тогда замени vX.field_value на, скажем, MAX(vX.field_value). На случай дублирования записей, чтобы не получать вместо одной итоговой строки пачку. Добавлено через 1 минуту и 16 секунд Хотя нет, не пачку... а случайное значение из всех, какие есть для заданного условия. Но это ничем не лучше. |
| Автор: SkyHawk 16.2.2016, 09:44 |
| Akina, хорошо, попробую. О результатах сообщу. Спасибо! |
| Автор: Akina 16.2.2016, 09:52 |
| SkyHawk, с другой стороны - структуру этой таблицы ты же получить можешь? вот и посмотри, может, там уже есть требуемый уникальный индекс, и не надо копья ломать... |
| Автор: SkyHawk 16.2.2016, 14:04 | ||
Akina, да, посмотрел, есть уникальный индекс, из двух полей!
Так что всё отлично! |