MySQL проблема с построением запроса. Создание столбцов из атрибутов - PullRequest
1 голос
/ 29 марта 2020

Я начал работать с базой данных MySQL. Я должен сделать задачу создания файла XML, используя java из существующей базы данных. Я уже выполнил структуру XML и вставил некоторые данные в документ, но у меня проблема с получением данных из БД. Эта проблема описана ниже:

products_extra_fields

products_extra_fields_id | products_extra_fields_name
-------------------------|---------------------------
           1             |       cpu
           2             |       hdd
           3             |       diagonal
           4             |       gpu

products

products_id | products_name | products_quantity  
------------| --------------|-------------------
      1     |  product name |      123
      2     |  product name |      125
      3     |  product name |      12
      4     |  product name |      43

products_to_products_extra_fields

products_id  | products_extra_fields_id | products_extra_fields_value
-------------|--------------------------|---------------------------- 
      3      |            1             |             i7
      2      |            4             |           geforce
      2      |            1             |             i5
      3      |            3             |             15.6

Результат запроса должен выглядеть примерно так или примерно так:

products_id | cpu | diagonal |   gpu   | ...
------------|-----|--------- |---------|----
     3      | i7  |   15.6   | geforce | 
...
...

Есть ли какой-нибудь простой способ получить такие данные? Я уже присоединился к некоторым таблицам, но у меня слишком мало знаний, чтобы выполнить запрос, содержащий приведенный выше результат:

SELECT * FROM products p 
INNER JOIN products_description pd ON pd.products_id = p.products_id 
INNER JOIN products_to_categories ptc ON ptc.products_id = p.products_id 
INNER JOIN categories_description cd ON cd.categories_id = ptc.categories_id 
INNER JOIN manufacturers m ON p.manufacturers_id = m.manufacturers_id 
INNER JOIN products_availability_description pad ON pad.products_availability_id = p.products_availability_id 
INNER JOIN products_availability pa ON pa.products_availability_id = pad.products_availability_id 
WHERE p.products_quantity > 30

1 Ответ

1 голос
/ 29 марта 2020

Вы можете использовать условное агрегирование:

select
    pf.products_id,
    max(case when f.products_extra_fields_name = 'cpu'      then pf.products_extra_fields_value end) cpu,
    max(case when f.products_extra_fields_name = 'diagonal' then pf.products_extra_fields_value end) diagonal,
    max(case when f.products_extra_fields_name = 'gpu'      then pf.products_extra_fields_value end) gpu
from products_to_products_extra_fields pf
inner join products_extra_fields f 
    on e.products_extra_fields_id  = pf.products_extra_fields_id 
group by pf.products_id

Обратите внимание, что для этого результата вам не нужно приводить таблицу products; если вам нужны столбцы из этой таблицы (например, название продукта), вы можете взять с собой еще одну join.

Не имеющее отношения примечание: не следует указывать имя таблицы в имени столбца; это требует большей типизации, делает запрос более многословным и не добавляет много ценной информации (используя идентификаторы таблиц, мы уже знаем, какой столбец и из какой таблицы взят).

...