MySql - 枢轴 Table

MySql - Pivot Table

我正在尝试从 wp_postmeta table 中提取一些数据,这基本上是一系列 key/value 对与数字 post_id 相关联。因此,当我尝试为 post 提取各种值时,这就是我得到的:

这是我用来获取该输出的当前查询:

select post_id,meta_key,meta_value from wp_postmeta
where meta_key in ('_sku','_length','_width','_height')
and post_id in (
    select post_id from wp_postmeta
    where meta_value in ('28-005080','28-005287')
    )
    order by post_id DESC

我想做的是像这样格式化信息:

我已经尝试查看 MySql pivot table 示例,但我不确定它们是否适合这种特定情况。坦率地说,我不知道从哪里开始完成这项任务。

您可以使用条件聚合:

select post_id,
    max(case when meta_key = '_sku'    then meta_value end) as sku,
    max(case when meta_key = '_length' then meta_value end) as length,
    max(case when meta_key = '_width'  then meta_value end) as width,
    max(case when meta_key = '_height' then meta_value end) as height
from wp_postmeta
where 
    meta_key in ('_sku','_length','_width','_height')
    and post_id in (select post_id from wp_postmeta where meta_value in ('28-005080','28-005287'))
group by post_id
order by post_id desc

实际上,我们可以用 having 子句替换 where 子句中的子查询:

select post_id,
    max(case when meta_key = '_sku'    then meta_value end) as sku,
    max(case when meta_key = '_length' then meta_value end) as length,
    max(case when meta_key = '_width'  then meta_value end) as width,
    max(case when meta_key = '_height' then meta_value end) as height
from wp_postmeta
group by post_id
having max(meta_value in ('28-005080','28-005287')) = 1
order by post_id desc