将多个MySQL记录转换为单个记录

时间:2017-06-21 17:17:32

标签: mysql sql database

我发现了类似的问题,但澄清我并不是尝试使用行值作为列标题。

我有一个包含以下列的表:
id =自动编号 item_id =表单提交的条目ID
field_id =提交的表单条目中的字段ID
meta_value =表单字段中提交的值
created_at =日期时间

我已经看过教程将字段值转换为列标题(即field_id1,field_id2等),但我实际上是在尝试将这些行转换为带内聚的标记记录。

列标题理想情况如下:
item_id (主键)
合同编号(其中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将它们全部连接在一个主查询中这一切都在一起。但从表现的角度来看,这似乎是一种糟糕的做法。

如果有人能指出我的例子,或者可能帮助我解决我应该寻找的术语,我非常感谢!!

谢谢!

2 个答案:

答案 0 :(得分:1)

您希望使用条件聚合将您的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演示

答案 1 :(得分:1)

您可以为4个值使用自联接

  select 
        t1.item_id
      , t1.meta_value as `Contract Number`
      , t2.meta_value as Vendor
      ,  t3.meta_value as Type
      , t4.meta_value as Scope 
  from my_table t1
  inner join my_table t2 on t1.item_id = t2.item_id and t2.fiedl_id = 101 
  inner join my_table t3 on t1.item_id = t3.item_id and t3.fiedl_id = 102 
  inner join my_table t4 on t1.item_id = t4.item_id and t3.fiedl_id = 103
  where t1.field_id = 100