2015-06-29 29 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