Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамические поля - в одно поле 
V
    Опции темы
SkyHawk
Дата 15.2.2016, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 17.8.2006
Где: г. Новосибирск

Репутация: нет
Всего: 2



Ребята, помогите!
В 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 я не гуру.

Это сообщение отредактировал(а) SkyHawk - 15.2.2016, 12:51
--------------------
Быть может все, что может быть, И даже то, что быть не может.
PM MAIL WWW   Вверх
Akina
Дата 15.2.2016, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 453



Либо построить статический текст запроса, учитывающий ВСЕ возможные типы "динамических полей" (на самом деле - необязательных атрибутов), либо строить текст такого запроса динамически.
Выходом мог бы быть перекрёстный запрос, но в MySQL они не реализованы.

Впрочем, непонятно, что это за задача такая - "свести воедино". Ну, допустим, свёл - дальше что? показать на экране? использовать как источник данных другого запроса? что-то ещё? Это не задача, а первый этап решения какой-то задачи, тут не озвученной. И не факт, что путь решения той самой неозвученной задачи выбран правильно.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
SkyHawk
Дата 15.2.2016, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 17.8.2006
Где: г. Новосибирск

Репутация: нет
Всего: 2



Akina, всё правильно, это часть другой задачи, цель этой подзадачи - создать источник данных для формирования отчёта по заявкам - xls-таблица, которая будет формироваться именно в указанном выше виде (см. результирующая таблица). Реализовать надо именно через mySQL, без PHP, js, и т.д., потому что использоваться будет в BI-системе, в которой источники данных формируются визуально из существующих таблиц (и при формировании отображается SQL-запрос, который будет выполняться).
--------------------
Быть может все, что может быть, И даже то, что быть не может.
PM MAIL WWW   Вверх
Akina
Дата 15.2.2016, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 453



Ну а я что говорю? так себе путь решения выбран...

Выгружай данные в 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 строй требуемый ПЕРЕКРЁСТНЫЙ отчёт.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
SkyHawk
Дата 15.2.2016, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 17.8.2006
Где: г. Новосибирск

Репутация: нет
Всего: 2



Akina, спасибо! Буду думать...
--------------------
Быть может все, что может быть, И даже то, что быть не может.
PM MAIL WWW   Вверх
SkyHawk
Дата 15.2.2016, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 17.8.2006
Где: г. Новосибирск

Репутация: нет
Всего: 2



Дабы не задействовать клиентскую сторону (.xls), решил вопрос вот как: так как виды полей - поля в таблице хоть и динамические, но имеющие конкретные ID-шники, которые меняться не будут, создал запрос с несколькими LEFT JOIN, и с выборкой по конкретным ID-шникам.

Код

   SELECT t.ticket_id, v1.field_value,  v2.field_value,  v3.field_value,  v4.field_value,  v5.field_value,  v6.field_value, v7.field_value FROM tickets t 
    LEFT JOIN field_values v1 ON v1.ticket_id = t.ticket_id AND v1.field_id = 726
    LEFT JOIN field_values v2 ON v2.ticket_id = t.ticket_id AND v2.field_id = 725
    LEFT JOIN field_values v3 ON v3.ticket_id = t.ticket_id AND v3.field_id = 729
    LEFT JOIN field_values v4 ON v4.ticket_id = t.ticket_id AND v4.field_id = 730
    LEFT JOIN field_values v5 ON v5.ticket_id = t.ticket_id AND v5.field_id = 767
    LEFT JOIN field_values v6 ON v6.ticket_id = t.ticket_id AND v6.field_id = 768
    LEFT JOIN field_values v7 ON v7.ticket_id = t.ticket_id AND v7.field_id = 769
    GROUP BY t.ticket_id DESC
 

 Костыль блин, кривоватый костыль, но проблема решилась. smile



Это сообщение отредактировал(а) SkyHawk - 15.2.2016, 14:48
--------------------
Быть может все, что может быть, И даже то, что быть не может.
PM MAIL WWW   Вверх
Akina
Дата 15.2.2016, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 453



Обязательно наложи на EAV-таблицу требование уникальности пары (ticket-ID,prop-ID), а то будет тебе щастье с таким костылём...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
SkyHawk
Дата 16.2.2016, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 17.8.2006
Где: г. Новосибирск

Репутация: нет
Всего: 2



Akina, увы, непосредственно мне данная таблица доступна лишь на чтение... :(
--------------------
Быть может все, что может быть, И даже то, что быть не может.
PM MAIL WWW   Вверх
Akina
Дата 16.2.2016, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 453



Тогда замени vX.field_value на, скажем, MAX(vX.field_value). На случай дублирования записей, чтобы не получать вместо одной итоговой строки пачку.

Добавлено через 1 минуту и 16 секунд
Хотя нет, не пачку... а случайное значение из всех, какие есть для заданного условия. Но это ничем не лучше.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
SkyHawk
Дата 16.2.2016, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 17.8.2006
Где: г. Новосибирск

Репутация: нет
Всего: 2



Akina, хорошо, попробую. О результатах сообщу.

Спасибо!

--------------------
Быть может все, что может быть, И даже то, что быть не может.
PM MAIL WWW   Вверх
Akina
Дата 16.2.2016, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 453



SkyHawk, с другой стороны - структуру этой таблицы ты же получить можешь? вот и посмотри, может, там уже есть требуемый уникальный индекс, и не надо копья ломать...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
SkyHawk
Дата 16.2.2016, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 17.8.2006
Где: г. Новосибирск

Репутация: нет
Всего: 2



Akina, да, посмотрел, есть уникальный индекс, из двух полей! 

Код

UNIQUE INDEX ticket_id (ticket_id, field_id),


Так что всё отлично!
--------------------
Быть может все, что может быть, И даже то, что быть не может.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.1855 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.