You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将键值对结构数据库表的查询结果转为多列格式?

解决方案:EAV表转宽表

没问题,这是典型的EAV(实体-属性-值)模型转宽表的场景,咱们用条件聚合就能轻松实现你的需求。

你的表结构

首先明确你的表结构(替换your_table_name为实际表名):

CREATE TABLE your_table_name (
  id bigint(20) unsigned AUTO_INCREMENT,
  form_id mediumint(8) unsigned DEFAULT 0,
  entry_id bigint(20) unsigned,
  meta_key varchar(255) DEFAULT NULL,
  meta_value longtext DEFAULT NULL,
  PRIMARY KEY (id)
);

当前数据(整理为Markdown表格)

idform_identry_idmeta_keymeta_value
31114Address 1
611201
711212018-16-05
81123Product 1
111214Address 2
1412201
1512212018-16-05
161223Product2
201314Address3
2113201
2213212018-16-05
231323Prodcut3

实现需求的SQL语句

这条语句会把同一entry_id下不同meta_key对应的meta_value转换成单独的列:

SELECT
  entry_id,
  MAX(CASE WHEN meta_key = '14' THEN meta_value END) AS meta_value1,
  MAX(CASE WHEN meta_key = '20' THEN meta_value END) AS meta_value2,
  MAX(CASE WHEN meta_key = '21' THEN meta_value END) AS meta_value3,
  MAX(CASE WHEN meta_key = '23' THEN meta_value END) AS meta_value4
FROM your_table_name
-- 如果只需要特定form_id的数据,可以加上下面的条件
-- WHERE form_id = 1
GROUP BY entry_id
ORDER BY entry_id;

语句解释

  • CASE WHEN:判断每条记录的meta_key,匹配指定值时返回对应的meta_value,否则返回NULL
  • MAX():因为同一entry_id+meta_key只会有一条记录,用MAX()(或MIN())聚合可以把同一entry_id下的不同属性值合并到一行
  • GROUP BY entry_id:确保每个entry_id只生成一行结果
  • ORDER BY entry_id:按条目ID排序,让结果更规整

查询结果

执行后会得到你想要的格式:

entry_idmeta_value1meta_value2meta_value3meta_value4
1Address 112018-16-05Product 1
2Address 212018-16-05Product2
3Address312018-16-05Prodcut3

内容的提问来源于stack exchange,提问作者sim simo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:17:56