0

製品リスト内の各製品に使用する価格表を特定する必要があります。特定の製品に使用される正しい価格表は、私が既に知っているいくつかの製品パラメーターによって決まります。ただし、すべてのパラメータがすべての価格表に適用されるわけではありません。3 つの価格表の「基準」の例を次に示します。

pricelist_key    param     value
A                size      n1
A                weight    n2
A                color     n4
B                size      n5
B                weight    n6
B                color     n8
B                type      n10
C                weight    n2
C                min_size  n5

答えるべき質問は次のとおりです。「pricelist_key で識別される基準値のどのセットが、私の製品を満たしていますか?」

パラメータ値の各セットが一意であることを確認しました。つまり、各価格表には独自の基準および/または値のセットがあります。複数の価格表のすべての基準を満たすことはできません。すべての価格表を作成する必要があるパラメータの完全なセットは事前にわかっていますが、特定の価格表では、それらのパラメータの任意のサブセットを基準として使用できます。

手続き的に、製品をループし、価格表をループし、パラメーターをループします。最初のパラメーターを見逃したために、次の価格表に移動し、すべての基準を満たす製品の価格表が 1 つ見つかるまで続きました。次のステップは、識別された価格表で日付を検索し、そこで見つかった 1 つの価格を取得することです。

しかし、私はセット (このコンテキストでは「価格表基準セット」) を扱っており、これを SQL の自然な問題と見なす方法を理解したいと思います。基準の管理方法を自由に再設計できます。これは、私が描いたコーナーにすぎません。設計の目標は、価格表の基準を定義するために使用できるさまざまなパラメーターを処理することでした。

提案?

4

1 に答える 1

1

表示されるものが 1 つの製品の pricelist テーブルの一部であり、事前にわかっているすべての基準に一致する pricelist_key を見つける必要があると仮定すると、次のようなクエリを使用して見つけることができます。

SELECT pricelist_key, count(*) as params_matched FROM pricelist
WHERE product_id = 1
AND 
(    param = 'weight' AND value = 'n6'
  OR param = 'size'   AND value = 'n5'
  OR param = 'color'  AND value = 'n8' )
GROUP BY pricelist_key
HAVING params_matched = 3
于 2013-09-15T19:17:19.920 に答える