如何从专用“字段”表中选择值?

时间:2014-10-10 14:20:49

标签: mysql sql orm pivot entity-attribute-value

我的MySQL数据库中有两个表,它们是: Tho tables here

我希望有一些记录包含在表创建阶段未预定义的字段,因此我可以使用这对表来存储设置了不同字段的记录。

我用以下记录填写这些表格: Records

我想编写将返回以下结果的select查询:

desired result

在MySQL中有没有办法做到这一点,或者我应该选择这两个表并在PHP中处理它们以实现我需要的结果?

UPD:请注意我事先不知道字段的名称是什么,所以我不能将字段的名称硬编码到选择查询中。

2 个答案:

答案 0 :(得分:0)

试试这个:

select t.record_id, t.tim, t.source
     , sum(case when field_name = 'length' then field_value end) length
     , sum(case when field_name = 'width' then field_value end) width
     , sum(case when field_name = 'height' then field_value end) height
  from records t, fields tt
 where t.record_id = tt.record_id
 group by t.record_id, t.tim, t.source
 order by t.record_id

在MySQL中无法设置无限的field_names,Oracle提供了PIVOT功能,允许您接收无限的字段集,但它返回XML。

答案 1 :(得分:0)

您可以通过检索列名并生成查询来使用动态SQL(例如:How To have Dynamic SQL in MySQL Stored Procedure

但是我肯定会为此付出PHP路线。它是严格的字符串操作密集型,并不是SQL专为此设计的。

最终查询看起来像(伪代码):

SELECT 
  ID
  ,Time
  ,Source
  ,SUM(CASE WHEN field_name = 'Length' THEN field_value END) AS [Length]
  ,etc
FROM records
  INNER JOIN fields
GROUP BY
  ID

为找到的每个不同字段名称使用不同的CASE语句。