私は、他のテーブルの中でも、約 1,500 列のテーブルを持つ MySQL データベースを再設計中です。最初のテーブルに存在した各列/行のレコードを持つ 2 番目のテーブルを作成して、このテーブルのデータを正規化します。これらのテーブルを Master および MasterData と呼びましょう。Master には、そのテーブルのすべてのレコードが必要とする基本情報が含まれます。MasterData には、Master テーブルのレコードに関連するいくつかの追加データの値が含まれます。それでは、マスターが次のようになるとしましょう。
MasterID Property1 Property2
1 Yes No
2 No Yes
3 Yes Yes
4 No No
MasterData が次のようになるとします。
MasterID Property Value
1 Property3 Yes
1 Property4 No
3 Property3 No
4 Property7 Yes
ここまで私と?このデータをクエリして、一致するマスター行ごとに 1 つの行だけを返し、関連するすべてのマスターデータ情報を含むにはどうすればよいですか。いくつかの例を検索して見つけましたが、データの実行に時間がかかりすぎます。前述の 1 つの巨大なテーブルの既存のデータに基づいて、テスト用の MasterData テーブルを作成しました。この結果、MasterData には約 450 万のレコードがあり、次のクエリは実行に時間がかかりすぎてタイムアウトになります。
SELECT Property1, Property2, Master.MasterID,
GROUP_CONCAT(case when Property = "Property3" then Value end) as Property3,
GROUP_CONCAT(case when Property = "Property7" then Value end) as Property7
FROM Master LEFT JOIN MasterData USING (MasterID) GROUP BY MasterID
HAVING Property3='Yes' OR Property7='Yes';
また
Select * FROM Master AS M, MasterData AS MD1, MasterData AS MD2
WHERE M.MasterID=MD1.MasterID AND MD1.Property='Property3' AND MD1.Value='Yes'
AND M.MasterID=MD2.MasterID AND MD2.VAR='Property7' AND MD2.Value='Yes';
ここでも、MasterData のすべてのデータを、Master の列であるかのように 1 つの行で取得できるようにすることが目標です。これは可能ですか?
どんな助けでも大歓迎です!