0

私のアプリケーションには、製品と、このグループの製品が宣言しなければならない定義済みの一連のプロパティを持つ製品バリアント グループがあり、プロパティの組み合わせはその製品バリアント グループ全体で一意です。

アマゾンの画面例:

ここに画像の説明を入力

画像では、最初の選択メニューには明らかにすべての値があります。次の選択メニューは、以前に選択した値に応じて異なります。

これらの定義されたグループ プロパティには、固有の優先順位が割り当てられています。次の派生テーブルでは、プロパティ自体と同じです。

特定のプロパティ/優先度、およびプロパティ/優先度と値のペアの特定のリスト。可能な値を取得したい。値のペアの優先度は、指定された優先度よりも小さくする必要があります。

public String[] getProductVariantGroupValues(int productVariantGroupId, int priority, Map<Integer, String> prevValues);

例はそれをより明確にします:

関連する製品が定義したすべての製品バリアント グループ プロパティを一覧表示する SQL ステートメントがあります。

+---------+----------+-------- +
| | 製品 | 優先順位 | 値 |
+---------+----------+---------+
| | 1 | 1 | ブラック |
| | 1 | 2 | 38 |
| | 1 | 3 | ドット | ドット
| | 2 | 1 | ブラック |
| | 2 | 2 | 38 |
| | 2 | 3 | ストライプ |
| | 3 | 1 | イエロー |
| | 3 | 2 | 40 |
| | 3 | 3 | ストライプ |
+---------+----------+---------+

理解するためのその他のビュー *(優先度は理解するためだけに任意です。このビューでは、これは些細なことです)*:

+--------+--------+--------+---------+
| | 製品 | 値1 | 値2 | 値3 |
+--------+--------+--------+---------+
| | 1 | ブラック | 38 | ドット | ドット
| | 2 | ブラック | 38 | ストライプ |
| | 3 | イエロー | 40 | ストライプ |
+---------+---------------------------+

priority = 3prevValues =を指定して上記のメソッドを呼び出すと{(1, Black), (2, 38)}、次の結果配列が得られます{Dots, Stripes}

blackプロパティ/優先度に が選択され、プロパティ/優先度138が選択されている場合、プロパティ/優先度に2可能な値は次のとおりです3{Dots, Stripes}

この例は簡略化されており、任意の数のプロパティ/優先度をサポートする必要があります。任意の数の優先度の低い値をサポートするには、クエリを動的に作成する必要があります。

おそらく、一意の制約とこのクエリを非常に単純にするプロパティの固定セットで2番目のテーブルアプローチを使用する必要があります。

4

1 に答える 1

0

私が質問を正しく理解していれば、優先度 1 と優先度 2 の値があり、一致するすべての優先度 3 の値を取得したいと考えています。次のクエリは製品を取得します。

select product
from t
group by product
having max(case when priority = 1 and value = 'Black' then 1 else 0 end) = 1 and
       max(case when priority = 2 and value = 40 then 1 else 0 end) = 1

優先度 3 の値を取得するには、または巧妙な select ステートメントが必要です (製品に対して優先度が繰り返されないと仮定します)。

select product, max(case when priority = 3 then value end)
from t
group by product
having max(case when priority = 1 and value = 'Black' then 1 else 0 end) = 1 and
       max(case when priority = 2 and value = 40 then 1 else 0 end) = 1

これらのクエリは、コード内でクエリを作成する方法を理解するためのものです。一般化は非常に簡単です。

于 2013-02-06T01:50:28.543 に答える