Mysql 将多行转换为列

Mysql 将多行转换为列,mysql,sql,Mysql,Sql,我正在尝试从MySQL数据库中检索数据。 表(Tab_1)的结构如下: id key value 1 address xyz 1 post_code 120 1 country CA 如您所见,这实际上是订单详细信息 我想将键列转换为实际列,将值转换为该列的值。 意思是: 其中,id=1是此订单的键 MySQL中的表无法更改。它是我们使用的封闭系统(WordPress插件)的一部分。我只想写一个查询,从中获取一些数据 我的目标是在联接中使用它,以便更容易

我正在尝试从MySQL数据库中检索数据。 表(
Tab_1
)的结构如下:

id   key      value
 1   address   xyz
 1   post_code 120
 1   country   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的所有字段,即地址、邮政编码、国家等。 联接中的
是我需要将查询转换为联接的可读结构的地方


如何操作?

根据进行分组,对不同的键类型使用大小写表达式:

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

按分组,对不同的键类型使用大小写表达式:

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

您只能使用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;

您只能使用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;

GROUP BY,不同键类型的大小写表达式,.GROUP BY无法解决此问题。它不会将值转换为列。。请注意,
key
应成为一列,
value
应成为此列中的值。当我在select
x.address
中说时,我希望它给我
xyz
。分组方式,不同键类型的大小写表达式。分组方式无法解决此问题。它不会将值转换为列。。请注意,
key
应成为一列,
value
应成为此列中的值。当我在select
x.address
中说时,我希望它给我
xyz
。来选择非空值。您也可以使用MIN。(我假设每个id只有一个地址/邮政编码/国家)是的,只有一个。。。这就是为什么我不理解为什么需要max或min…如果一个id有3行,case表达式返回“null,null,value”。使用max或min选择非空值。选择非空值。您也可以使用MIN。(我假设每个id只有一个地址/邮政编码/国家)是的,只有一个。。。这就是为什么我不理解为什么需要max或min…如果一个id有3行,case表达式返回“null,null,value”。使用max或min选择非空值。如果要这样做,至少要有相关的子查询。(现在您总是返回id=1的值。)如果您这样做,至少有相关的子查询。(现在您总是返回id=1的值。)