长话短说,我有一些稍微复杂的查询(参见下面的示例)并且需要将它们的结果保存到一个表中而不是每次都运行它们。我有大约 6 个月的 MYSQL 经验,所以我知道的足以让自己陷入困境。
背景:每个产品都有多个规则来确定定价、运输等。kitruleoptions 表将每个规则连接到它将应用的下拉选项——因此,如果客户选择“添加可选 X”,则与 Xs 有关的规则得到应用。选项集表将每个 ProductItemID 连接到与其关联的下拉选项。因此,仅当在该规则的下拉选项集中找到所有产品项的下拉选项时,规则才应适用于特定产品项。换句话说,并不是每次选择 X 时都必须应用该规则,而是每次在下拉列表 A 中选择 X 并且在下拉列表 B 中选择 Y 或 Z 时应用它,但如果在下拉列表中选择 W 则不适用B、
这是一个示例查询,它为我获取单个 ProductItemID 的总价。
SELECT ProductItemID, SUM(RulePrice * ItemQuantity) AS Price FROM
(SELECT RuleGroups, ProductItemGroups, RulePrice, ItemQuantity, productitems.ProductItemID
FROM kitrules
LEFT JOIN productitems ON productitems.ProductID = kitrules.ProductID
LEFT JOIN (SELECT RuleID, GROUP_CONCAT(OptionGroupID ORDER BY OptionGroupID) AS RuleGroups
FROM kitruleoptions
WHERE OptionGroupID IN (SELECT OptionGroupID FROM optionsets WHERE ProductItemID = %s)
GROUP BY RuleID) AS k ON k.RuleID = kitrules.RuleID
LEFT JOIN (SELECT ProductItemID, GROUP_CONCAT(OptionGroupID ORDER BY OptionGroupID) AS ProductItemGroups
FROM optionsets
GROUP BY ProductItemID) AS o ON o.ProductItemID = productitems.ProductItemID
WHERE productitems.ProductItemID = %s AND RuleGroups = ProductItemGroups) AS x
GROUP BY x.ProductItemID
目前,这个选择(或者更确切地说,一个更复杂的选择不仅仅是价格)进入一个 INSERT INTO 语句,有点像这样:
INSERT INTO pricelists (ProductItemID, Price)
SELECT [the query above]
WHERE ProductItemID = %s
我正在尝试制定它,而不是像这样:
INSERT INTO pricelists (ProductItemID, Price)
SELECT [a new query that only requires ProductID]
WHERE ProductItemID IN (SELECT ProductItemID FROM productitems WHERE ProductID = %s)
... 只需要输入ProductID,即可一次更新整个产品。这样,我将不再需要循环遍历 PHP 数组来执行此操作。在kitrules 表和productitems 表中都找到了ProductID,所以我觉得应该有办法,但我好像找不到。所以我的问题是,如何将查询重新表述为只需要 ProductID?有可能吗?有没有办法在没有 GROUP_CONCAT 的情况下直接比较选项集集和 kitruleoptions 集?另外,我将如何使用触发器设置它,它应该触发什么?我以前从未做过触发器。
编辑:这是我的 SQL Fiddle其中有一个简单的例子说明表格应该如何结束。我的想法是,我从一个设置开始,每个产品只有一个或多个项目,但后来由于需求的后期变化(是的),我不得不添加生成套件项目或组合项目的能力多个不同的项目,但工具包本身就是项目。要求是套件的 ItemCost 是其包含的项目的 ItemCosts 的总和,套件的价格是其包含的规则的 RulePrices 乘以 ItemQuantity 的总和,并且其运费由其包含的项目的运输信息的组合运输确定,但除此之外,套件只是另一件元素。提示三周的头痛和计数。
最佳答案
我终于明白了:
SELECT ProductItemID, SUM(RulePrice * ItemQuantity) AS TotalPrice FROM
(SELECT p.ProductItemID, k.RuleID, p_count, COUNT(k.RuleID) AS k_count,
RulePrice, ItemQuantity
FROM productitems
INNER JOIN optionsets o ON productitems.ProductItemID = o.ProductItemID
INNER JOIN (SELECT ProductItemID, COUNT(OptionGroupID) AS p_count
FROM optionsets
GROUP BY ProductItemID) AS p ON p.ProductItemID = o.ProductItemID
LEFT JOIN kitruleoptions k ON k.OptionGroupID = o.OptionGroupID
LEFT JOIN kitrules ON k.RuleID = kitrules.RuleID
WHERE productitems.ProductID = %s
GROUP BY o.ProductItemID, k.RuleID
HAVING k_count = p_count) AS x
GROUP BY x.ProductItemID
关于mysql - 使用嵌套子查询优化 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10645408/