2016-04-07 133 views
0

我试图从MySQL数据库中检索数据。 表的结构(Tab_1)有:将multy行转换为列

id key  value 
1 address xyz 
1 post_code 120 
1 country CA 

正如你可以看到这是实际订单的细节信息。

我想将键列转换为实际列,并将该值转换为此列的值。 含义:

id address post_code country 
------------------------------------ 
    1 xyz  120   CA 

哪里id=1是此订单的关键。

MySQL中的表格无法更改。它是我们使用的一个关闭系统的一部分(WordPress插件)我只想编写一个查询,从中获取一些数据...

我的目标是在连接中使用它,它会更容易获得数据:

Select x.address ,x.post_code, x.country 
from orders 
join (...) as x using (order_id=id) 
where order_id=1 

它应该给:

address post_code country 
------------------------------------ 
     xyz  120   CA 

正如你可以看到它想获得x的所有领域这是地址,post_code,国家等 的...的连接是哪里我需要把转换为的查询为加入的可读结构。

我该怎么做?

+0

GROUP BY,表达式的情况下为不同的密钥类型,。 – jarlh

+0

Group By不会解决这个问题。它不会将值转换为列。请注意,'key'应该成为列,而'value'应该成为此列中的值。当我在选择'x.address'时说我想让它给我'xyz'。 – java

回答

2

做一个GROUP BY,使用CASE表达式不同的密钥类型:

select id, 
     max(case when key = 'address' then value end) as address, 
     max(case when key = 'post_code' then value end) as post_code, 
     max(case when key = 'country' then value end) as country 
from orders 
group by id 
+0

你为什么用Max? – java

+0

选取非空值。你也可以使用MIN。 (我假设每个ID只有一个地址/ post_code /国家) – jarlh

+0

是只有一个......这就是为什么我不明白为什么最大和最小值是需要的...... – java

0

只能使用4选择:

SELECT id, (SELECT value FROM Tab_1 WHERE id = 1 AND `key` = 'address') AS address, 
(SELECT value FROM Tab_1 WHERE id = 1 AND `key` = 'post_code') AS post_code, 
(SELECT value FROM Tab_1 WHERE id = 1 AND `key` = 'country') AS country FROM Tab_1 
GROUP BY id; 
+1

如果你这样做,至少有相关的子查询。 (现在你总是返回id = 1的值。) – jarlh