属しているグループに応じて機能ステートメントが「and」または「or」条件で形成される特定の機能の製品を選択するクエリを作成する方法は?
状況説明
- 商品のあるお店があります。
- 製品には機能がある場合とない場合があります。
- 顧客は製品の特定の機能を探します。これは、フォームに記入して機能 ID の配列を送信することを意味します。
- データベースでは、各フィーチャは 1 つのフィーチャ グループにのみ属します。
- 最初のグループ (disjunction 属性が true、「OR」と呼ばれる) では、機能の 1 つが顧客から提出された機能と一致する場合に製品を表示できます。
例: 形状を選択: 円、正方形、三角形 円、正方形、または三角形の製品が表示されます。 - 2 番目のグループ (disjunction 属性が false、「AND」と呼ばれる) では、製品が顧客から提出されたすべての機能を備えている場合にのみ製品を表示できます。
例: 赤、緑、青の色を選択すると、赤と緑と青の製品が表示されます。
テスト環境
http://sqlfiddle.com/#!12/f4db7
"OR" クエリ
機能のない製品を除いて機能します。
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