次の列を持つ、単純化された 3 つの MYSQL テーブルがあります。
ModuleEntries (MDE_ID)
ModuleFields (MDF_ID, MDF_Label)
ModuleEntryFieldValues (MFV_ID, MFV_MDE_ID, MFV_MDF_ID, MFV_Value)
単純化された列のリストからわかるようにModuleEntryFieldValues
、「エントリの場合、このフィールドにはこの値が含まれる」と記載されている表です。
ここで、この情報を 1 つの "フラット" レコードセットで取得したいと思います。私は物事をうまく機能させることができましたが、完全には望んでいませんでした。
別の 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、...」を提供します
これら3つのテーブルを結合
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
私の質問が十分に明確であることを願っています。そうでない場合は、コメントしてください。可能であれば、必要に応じてさらに情報を提供します。