我发现了类似的问题,但澄清我并不是尝试使用行值作为列标题。
我有一个包含以下列的表:
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将它们全部连接在一个主查询中这一切都在一起。但从表现的角度来看,这似乎是一种糟糕的做法。
如果有人能指出我的例子,或者可能帮助我解决我应该寻找的术语,我非常感谢!!
谢谢!
答案 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