2016-08-12 7 views
0

I以下の標準的な多対多の関係を有する: http://sqlfiddle.com/#!9/43bd68/28/0多対多の組み合わせ

(簡易版) - Iは、カテゴリ1、2、3及び製品2を有する製品1を有しますカテゴリ1、3を持っています。

私が達成しようとしているのは、カテゴリの特定の組み合わせに属する製品を選択することです。

  • をカテゴリ(1または2)に属している製品を取得し、カテゴリ(3)に属している:それを説明するために

    。これは製品1と2の両方を返します。

  • カテゴリ(2)に属し、カテゴリ(3)に属する製品を取得します。これが唯一の製品を返すべき1つの

カテゴリは、「フィルタ」のように振る舞うべき - 私の最初の考えはカテゴリが1行に1つの値であるとして、WHERE category IN (1, 2) AND category IN (3)を設定するが、これは動作しませんでした理由です。私は「foreach製品のようなものが必要だし、カテゴリー(1または2)とカテゴリ(3)を持っている場合は製品チェックの内側にある必要があると思う。

これをSQLクエリで実現することはできますか?

答えて

1

次のようなクエリを使用することができます。

SELECT 
    p.name as prodName, p.id as pid 
FROM 
    Product p 
JOIN Category_Product cp ON p.id = cp.product_id 
JOIN Category c ON c.id = cp.category_id 
WHERE category_id IN (2,3) 
GROUP BY pid 
HAVING COUNT(*) = 2 

Demo here

あなたはHAVING句で条件付きの集約を使用する必要が最初のケースのためのクエリを実装するには:

SELECT 
    p.name as prodName, p.id as pid 
FROM 
    Product p 
JOIN Category_Product cp ON p.id = cp.product_id 
JOIN Category c ON c.id = cp.category_id 
WHERE category_id IN (1,2,3) 
GROUP BY pid 
HAVING COUNT(CASE WHEN category_id IN (1,2) THEN 1 END) > 0 AND 
     COUNT(CASE WHEN category_id = 3 THEN 1 END) >= 1 

Demo here

+0

ありがとう速い返信。最初のケース - 「カテゴリIN(1,2)ANDカテゴリIN(3)」に関する例を教えてください。 – o15a3d4l11s2

+0

@ o15a3d4l11s2私が行った編集を確認してください。 –

関連する問題