SQL - Присоединить данные таблицы пользовательских свойств к основной таблице в SELECT - PullRequest
0 голосов
/ 11 апреля 2020

Мне нужно извлечь данные из двух таблиц. Данные в первой таблице ( projects ) настраиваются пользовательскими свойствами из второй ( custom_values ​​). Список и тип пользовательских свойств описаны в третьей таблице ( custom_fields ):

enter image description here

Мне нужно написать запрос или процедура, которая извлекает данные из первой таблицы ( projects ), добавляя к ней все пользовательские значения, относящиеся к записи из таблицы custom_values ​​, например:

enter image description here

Я не могу изменить структуру базы данных. Механизм БД: MySQL 5.7

UPD: я начал с запроса, подобного следующему:

SELECT
  a.name,
  a.project_desc,
  b.value
FROM
  projects AS a
  LEFT JOIN custom_values AS b ON a.id = b.customized_id
  LEFT JOIN custom_fields AS c ON b.custom_field_id = c.id

Он, безусловно, работает, но выдает 3 разные строки на проект с разными значениями custom_value:

enter image description here

Мне нужна одна строка на проект со всеми значениями в ней (см. Выше).

Ответы [ 3 ]

0 голосов
/ 11 апреля 2020

Я думаю, вы хотите условное агрегирование:

SELECT p.name, p.project_desc,
       MAX(CASE WHEN cv.custom_field_id = 7 THEN cf.value END),
       MAX(CASE WHEN cv.custom_field_id = 8 THEN cf.value END),
       MAX(CASE WHEN cv.custom_field_id = 9 THEN cf.value END)
FROM projects p LEFT JOIN
     custom_fields cf
     ON cv.customized_id = p.id and
        cv.customized_type = 'PROJECT' and
         cv.custom_field_id = cf.id
GROUP BY p.name, p.project_desc;
0 голосов
/ 12 апреля 2020

Наконец, благодаря Гордону Линоффу, я нашел решение:

SELECT p.name, p.description,
       MAX(CASE WHEN cv.custom_field_id = 4 THEN cv.value END) AS value_1,
       MAX(CASE WHEN cv.custom_field_id = 5 THEN cv.value END) AS value_2,
       MAX(CASE WHEN cv.custom_field_id = 6 THEN cv.value END) AS value_3
FROM projects p LEFT JOIN
     custom_values cv
     ON cv.customized_id = p.id
     GROUP BY p.name, p.description;
0 голосов
/ 11 апреля 2020

Как то так?

SELECT
  a.name,
  a.project_desc,
  b.value
FROM
  projects AS a
  LEFT JOIN custom_values AS b ON a.id = b.customized_id
  LEFT JOIN custom_fields AS c ON b.custom_field_id = c.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...