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 = 3用prevValues =调用上述方法{(1, Black), (2, 38)}应该会产生以下结果数组:{Dots, Stripes}.

如果black选择了属性/优先级138选择了属性/优先级,则属性/优先级2唯一可能的以下值3{Dots, Stripes}

该示例已简化,应支持任意数量的属性/优先级。必须动态创建查询以支持任意数量的较低优先级值。

也许我应该只使用具有一组固定属性的第二个表方法,这将使唯一约束和此查询非常简单。

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 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 回答