1

长话短说,我有一些稍微复杂的查询(参见下面的示例),需要将它们的结果保存到一个表中,而不是每次都运行它们。我有大约 6 个月的 MYSQL 经验,所以我知道的足以让自己陷入困境。

背景:每个产品都有多个决定定价、运输等的规则。kitruleoptions 表将每个规则连接到它将应用的下拉选项——因此,如果客户选择“添加可选 X”,则应用与 X 相关的规则。选项集表将每个 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 的总和,套件的 Price 是其包含的规则 RulePrices 乘以 ItemQuantity 的总和,其运输由其所含物品的运输信息的组合运输确定,但除此之外,套件只是另一件物品。提示三周的头痛和计数。

4

1 回答 1

1

我最终想通了:

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
于 2012-05-21T16:47:46.103 回答