1

簡単に言うと、少し複雑なクエリがあり(以下の例を参照)、毎回実行するのではなく、結果をテーブルに保存する必要があります。私はMYSQLの経験が約6か月あるので、問題が発生するのに十分な知識があります。

背景:各製品には、価格や送料などを決定する複数のルールがあります。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

現在、このselect(または、価格以上のものを選択するより複雑なselect)は、次のようなINSERTINTOステートメント内にあります。

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配列をループする必要がなくなります。ProductIDはkitrulesテーブルとproductitemsテーブルの両方にあるので、方法があるはずだと思いますが、見つからないようです。だから私の質問は、ProductIDだけを必要とするようにクエリを再定式化するにはどうすればよいですか?それも可能ですか?GROUP_CONCATを使用せずに、オプションセットのセットとkitruleoptionsのセットを直接比較する方法はありますか?また、これをトリガーでどのように設定し、何をトリガーする必要がありますか?私はこれまでトリガーを行ったことがありません。

編集:これが私のSQL Fiddleで、テーブルがどのように終わるかについての簡単な例があります。アイデアは、各製品に1つ以上のアイテムが含まれるセットアップから始めましたが、要件の変更が遅れたため(yay)、キットまたはの組み合わせであるアイテムを生成する機能を追加する必要がありました。複数の異なるアイテムですが、キットはそれ自体がアイテムです。要件は、キットのItemCostが含まれるアイテムのItemCostsの合計であり、キットの価格が含まれるルールのRulePricesとItemQuantityの合計であり、その出荷は、含まれるアイテムの出荷情報の合計出荷によって決定されることです。それ以外の場合、キットは単なる別のアイテムです。3週間の頭痛とカウントの合図。

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 に答える