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

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

问题描述:

我发现了类似的问题,但为了澄清我没有尝试将行值用作列标题。将多个MySQL记录转换为单个记录

我有下面的表:
ID =自动编号
ITEM_ID =表单提交
FIELD_ID =在提交的表单条目中的字段ID的条目号
meta_value =表单域中提交的值
created_at = datetime

我见过的教程将字段值转换为列标题(即field_id1,field_id2等),但我实际上试图将这些行转换为一个有凝聚力的标签记录。

列标题将理想地是这样的:
ITEM_ID(主键)
合同号(值,其中FIELD_ID = 100 AND ITEM_ID =从第一列的值)
卖方(值其中FIELD_ID = 101和ITEM_ID =从第一列的值)
类型(值,其中FIELD_ID = 102和ITEM_ID =从第一列的值)
范围(值,其中FIELD_ID = 103 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演示

+0

令人难以置信。非常感谢您的指导! – Nick

你可以使用一个自连接的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