0

次のようなデータを含む と のentry_id2つの列を持つテーブルがあります。cat_id

エントリ ID | cat_id
1 2
1 3
1 4
1 5
1 6
1 7

この例では、が、、cat_idの任意のグループに分割されていると想像してください。(2,3)(4,5)(6,7)

次のクエリを使用しています。

SELECT DISTINCT 
    t1.entry_id 
FROM 
    items t1 
JOIN 
    items t2 
ON 
    t2.entry_id = t1.entry_id 
JOIN
    items t3
ON 
    t3.entry_id = t1.entry_id
WHERE 
    t1.cat_id IN (2, 3) 
AND 
    t2.cat_id IN (4, 5)
AND
    t3.cat_id IN (6, 7)

entry_idのを返します1

クエリは機能しますが、状況に応じて、自己結合の数は 1 ~ 5 になります。可変数の自己結合を持たないソリューションを探しています - これは可能ですか?

4

2 に答える 2

2

試す:

select entry_id
from items
group by entry_id
having count(distinct case
                          when cat_id in (2,3) then 1
                          when cat_id in (4,5) then 2
                          when cat_id in (6,7) then 3
                      end) = 3

ここでSQLFiddle 。

于 2013-05-28T16:47:04.937 に答える
0

やや似た質問から回答されたように、ユーザーはクエリを動的に作成していて、適用される基準の数を知りませんでした。JOIN と WHERE の組み合わせが難しかったのですが、このような変更により実装が非常に簡単になりました...

SELECT DISTINCT 
      t1.entry_id 
   FROM 
      items t1 

         JOIN items t2 
            ON t1.entry_id = t2.entry_id
           AND t2.cat_id IN (4, 5)

         JOIN items t3
            ON t1.entry_id = t3.entry_id
           AND t3.cat_id IN (6, 7)

   WHERE 
      t1.cat_id IN (2, 3) 

where はカテゴリの主要な基準を適用し、一致するキーを持つ各結合であり、その基準は、結合がそのようなレコードを持ち、必要な結果を与えることを許可するかどうかのいずれかです... 自動化は、JOIN/ON/ を構築するだけですAND コンポーネントを使用し、必要に応じてエイリアス T2、T3、T4 を増やし続けます。

于 2013-05-28T17:04:52.097 に答える