我有三个简化的 MYSQL 表,包含以下列:
ModuleEntries (MDE_ID)
ModuleFields (MDF_ID, MDF_Label)
ModuleEntryFieldValues (MFV_ID, MFV_MDE_ID, MFV_MDF_ID, MFV_Value)
正如您从简化的列列表中看到的那样,ModuleEntryFieldValues
该表声明“对于一个条目,此字段具有此值”。
现在,我想在一个“平面”记录集中检索这些信息。我已经设法让事情正常进行,但并不完全符合我的要求。
在另一篇 SO 文章的帮助下,我设法通过使用游标使动态、可变数量的列工作。
declare finish int default 0;
declare fldid int;
declare str varchar(10000) default 'SELECT *,';
declare curs cursor for select MDF_ID from ModuleFields group by MDF_ID;
declare continue handler for not found set finish = 1;
open curs;
my_loop:loop
fetch curs into fldid;
if finish = 1 then
leave my_loop;
end if;
set str = concat(str, 'max(case when MFV_MDF_ID = ',fldid,' then MFV_Value else null end) as field_',fldid,',');
end loop;
close curs;
set str = substr(str,1,char_length(str)-1);
set @str = concat(str, ' from ModuleEntries LEFT join ModuleEntryFieldValues ON MDE_ID = MDF_MDE_ID GROUP BY MDE_ID');
prepare stmt from @str;
execute stmt;
deallocate prepare stmt;
这段代码没有做的是允许我将列值MDF_Label
作为行的实际列标题。现在,上面的代码给了我“field_1, field_2, ...”
是否可以连接这三个表,并
MDF_Label
为现在是连接表中列的行设置列标题?我要这个...
ModuleEntries | ModuleFields | ModuleEntryFieldValues
------------- | ------------------ | -----------------------------------
MDE_ID | MDF_ID - MDF_Label | MFV_MDE_ID - MFV_MDF_ID - MFV_Value
1 | 1 - Height | 1 - 1 - 120cms
| 2 - Width | 1 - 2 - 30cms
| 3 - Weight |
进入这个
Recordset
---------
MDE_ID - Height - Width - Weight
1 - 120cms - 30cms - null
我希望我的问题足够清楚。如果没有,请发表评论,如果可以的话,我会在需要的地方提供更多信息。