我正在重新设计一个MySQL数据库,其中有一张表大约有1,500个列,还有其他的表。我们想通过创建第二个表来规范化该表中的数据,该表将为初始表中存在的每个列/行创建一条记录。我们称这些表为Master和MasterData。Master将包含所有记录都需要的基本信息。MasterData将包含有关Master表中记录的一些附加数据的值。因此,假设Master看起来像这样:
或者
MasterID Property1 Property2
1 Yes No
2 No Yes
3 Yes Yes
4 No No
假设主数据看起来像这样:
MasterID Property Value
1 Property3 Yes
1 Property4 No
3 Property3 No
4 Property7 Yes
理解了吗?如何查询这些数据并且每个匹配的主记录只返回一行,但包含所有相关的主数据信息。我已经搜索并找到了几个示例,但它们在我们的数据上执行时间太长。我根据之前提到的巨大表中的现有数据创建了一个测试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';
再次强调,我们的目标是能够以Master中列的形式检索MasterData中的所有数据。 这种操作是否可行?
非常感谢您的帮助!