我的MySQL数据库中有两个表,它们是:
我希望有一些记录包含在表创建阶段未预定义的字段,因此我可以使用这对表来存储设置了不同字段的记录。
我用以下记录填写这些表格:
我想编写将返回以下结果的select查询:
在MySQL中有没有办法做到这一点,或者我应该选择这两个表并在PHP中处理它们以实现我需要的结果?
UPD:请注意我事先不知道字段的名称是什么,所以我不能将字段的名称硬编码到选择查询中。
答案 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语句。