我正在为我学校的午餐订单程序撰写报告,我做了一个查询,该查询给了我需要的结果,但速度非常慢。我正在考虑使用相关的子查询来加速(来自另一个类似的线程的建议),但无法通过语法错误,甚至不知道它是否会完成我想要的。MYSQL加速查询
涉及的两个表是Ordered_Items和Ordered_Options有序项目表通常会在有序选项表中有3-4个相关记录,它们代表学生在订购午餐时选择的选项。
一个典型的记录看起来像这样
Ordered_Items.Record_Number = 1
Ordered_Items.Name = Pizza
Ordered_Options.Ordered_Items_rn = 1
Ordered_Options.Value = Jane
Ordered_Options.rn = 43
Ordered_Options.Ordered_Items_rn = 1
Ordered_Options.Value = Doe
Ordered_Options.rn = 44
Ordered_Options.Ordered_Items_rn = 1
Ordered_Options.Value = Pepperoni
Ordered_Options.rn = 45
,我想他们都显示为报告的目的,从而从查询的输出会看起来像一个单个记录:披萨Jane Doe的辣。 Ordered_Options.rn是一致的,意思是名字总是= 44等等。我已经把我的代码放在下面。
SELECT
OI.Name AS ItemName,
opt1.`Value` AS StudentFirst,
opt2.`Value` AS StudentLast,
opt3.`Value` AS Grade,
opt4.`Value` AS Milk
FROM
((((
Ordered_Items OI
LEFT JOIN Ordered_Options opt1 ON ((
(OI.record_number = opt1.Ordered_Items_rn)
AND(opt1.Options_rn = 43))))
LEFT JOIN Ordered_Options opt2 ON((
(OI.record_number = opt2.Ordered_Items_rn)
AND(opt2.Options_rn = 44))))
LEFT JOIN Ordered_Options opt3 ON ((
(OI.record_number = opt3.Ordered_Items_rn)
AND(opt3.Options_rn = 46))))
LEFT JOIN Ordered_Options opt4 ON ((
(OI.record_number = opt4.Ordered_Items_rn)
AND(opt4.Options_rn = 55))))
如果您对数据库有任何控制权,请考虑规范化此设计。学生的名字和姓氏没有业务是订购商品的“选项”。 –