我发现了与此类似的问题,但为了澄清我没有尝试使用行值作为列标题。
我有一个包含以下列的表格:
id = 自动编号
item_id = 表单提交的条目ID
field_id = 提交的表单条目中的字段 ID
meta_value = 表单字段中提交的值
创建时间 = 日期时间
我看过将字段值转换为列标题(即 field_id1、field_id2 等)的教程,但我实际上正在尝试将这些行转换为内聚的带标签记录。
列标题理想情况下应如下所示:
item_id(主键)
契约(Contract)编号(值,其中 field_id = 100 AND item_id = 第一列中的值)
供应商(值,其中 field_id = 101 AND item_id = 第一列中的值)
类型(值,其中 field_id = 102 AND item_id = 第一列中的值)
范围(值,其中 field_id = 103 AND item_id = 第一列中的值)
我知道我可以通过进行一系列小型查询来实现这一点,其中它具有 item_id 和 meta_value ,其条件设置为仅显示特定 field_id 中的记录,然后使用 item_id 将它们全部连接到主查询中这一切都在一起。但从性能的角度来看,这似乎是一种糟糕的方法。
如果有人能给我举一个例子,或者帮助我找到我应该寻找的术语,我将不胜感激!!
谢谢!
最佳答案
您想要使用条件聚合将 EAV (Entity Attribute Value) 中的记录拼凑在一起结构
SELECT item_id,
MAX(CASE WHEN field_id = 100 THEN meta_value END) contract,
MAX(CASE WHEN field_id = 101 THEN meta_value END) vendor,
MAX(CASE WHEN field_id = 102 THEN meta_value END) type,
MAX(CASE WHEN field_id = 103 THEN meta_value END) scope
FROM table1
GROUP BY item_id;
这是一个dbfiddle演示
关于mysql - 将多个 MySQL 记录转换为单个记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44682416/