如何创建一个查询来选择给定特征的产品,其中特征语句由“和”或“或”条件形成,具体取决于它们所属的组?
情况描述
- 有一个产品商店。
- 产品可能有功能,也可能没有。
- 客户寻找产品的特定功能,这意味着填写表格并发送一系列功能 ID。
- 在数据库中,每个特征只属于一组特征。
- 第一组(析取属性为真,称为“OR”)允许在其中一个特征与客户提交的任何特征匹配时显示产品。
示例:选择形状:圆形、方形、三角形显示圆形或正方形或三角形的产品。 - 第二组(析取属性为假,称为“AND”)仅在产品具有客户提交的所有特征时才允许显示产品。
示例:选择颜色:红、绿、蓝显示产品为红绿蓝。
测试环境
http://sqlfiddle.com/#!12/f4db7
“或”查询
除了那些没有功能的产品外,它可以工作。
SELECT product_id
FROM product_features
WHERE product_features.feature_id IN (
SELECT feature_id FROM features
LEFT JOIN feature_groups
ON features.feature_group_id = feature_groups.feature_group_id
WHERE feature_id IN (11, 12, 13) AND feature_groups.disjunction = TRUE
)
GROUP BY product_id
“AND”查询
无法使用此查询,因为不知道析取为假的特征数量。
SELECT product_id FROM product_features
WHERE feature_id IN (43, 53, 63)
GROUP BY product_id
HAVING COUNT(DISTINCT feature_id) = 3