我正在重新设计一个 MySQL 数据库,该数据库具有一个包含大约 1,500 列的表以及其他表。我们希望通过创建第二个表来规范化该表中的数据,该表将为初始表中存在的每一列/行提供一条记录。我们称这些表为 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
跟我到现在?如何查询此数据,并且每个匹配的主行仅返回一行,但包含所有相关的 MasterData 信息。我已经搜索并找到了几个示例,但它们需要很长时间才能在我们的数据上执行。我根据前面提到的一个巨大表中的现有数据创建了一个测试 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 中的一列一样。这可能吗?
任何帮助深表感谢!