2015-06-29 2 views
1

У меня есть базы данных MySQL с этими таблицами:MySQL: Строки в колонках динамически

таблица продуктов:

+-------------+ 
| id   | 
+-------------+ 
| 1   | 
| 2   | 
+-------------+ 

стол attribute_values:

+-------------+----------+-----------+ 
| product_id | key  | value  | 
+-------------+----------+-----------+ 
| 1   | title | Orange | 
| 1   | code  | O125  | 
| 2   | title | Pizza  | 
| 2   | code  | O138  | 
+-------------+----------+-----------+ 

И у меня есть этот запрос MySQL:

SELECT products.id, 
     MAX(CASE WHEN attribute_values.key = 'title' THEN attribute_values.value END) title, 
     MAX(CASE WHEN attribute_values.key = 'code' THEN attribute_values.value END) code 
FROM products JOIN attribute_values ON products.id = attribute_values.product_id 
GROUP BY products.id; 

С этим ou tput:

+-------------+----------+-----------+ 
| id   | title | code  | 
+-------------+----------+-----------+ 
| 1   | Orange | 0125  | 
| 2   | Pizza | O138  | 
+-------------+----------+-----------+ 

Я хотел бы сценарий, чтобы сформировать один столбец для каждого отдельного значения attribute_values.key без явного указания ключей (название и код в данном случае).

т.е. pseudoscript:

SELECT products.id 
generate column foreach distinct attribute_values.key 
FROM products JOIN attribute_values ON products.id = attribute_values.product_id 
GROUP BY products.id; 

ли это возможно в MySQL?

Спасибо за любые усилия :)

ответ

2

Для создания динамических сводных таблиц для динамических значений, которые нужно записать динамический SQL-то, как

set @sql = null; 
select 
    group_concat(distinct 
    concat(
     'max(case when a.`key` = ''', 
     a.`key`, 
     ''' then value end) AS ', 
     a.`key` 
    ) 
) into @sql 
from attribute_values a ; 

set @sql = concat('select p.id, ', @sql, ' from products p 
        join attribute_values a on a.product_id = p.id 
        group by p.id 
'); 

prepare stmt from @sql; 
execute stmt; 
deallocate prepare stmt; 

http://sqlfiddle.com/#!9/2224f/1

Смежные вопросы