2011-01-20 5 views
12

私はサイト上の項目のリストを持っています。各項目にはいくつかのカテゴリが付いています。これらのカテゴリを映画ジャンルと呼びましょう。高度な検索では、好きなジャンルのボックスにチェックを入れ、選択したジャンルのANYに一致する映画のリストを吐き出します。MySQL IN節をすべてを含む(ORの代わりに)

私はこのようなクエリがある:

AND column IN ('5', '8', '9') 

ここでの問題は、あなたが「アニメーション」と「恐怖」を選択した場合、あなたがディズニーの漫画(「アニメーション」)の束とSAWシリーズを取得することです("ホラー")。

検索をすべてを包括的にしたいので、選択したすべてのジャンルに一致する結果しか返されないため、「アニメーション」と「ホラー」の両方がマークされたアイテムが返されます。

item_idとcategory_idのペアは別のテーブルに格納されます。したがって、ID 55の映画の場合は4つのジャンルがあるため、item_id = 55の4つの行があり、category_idは4つのカテゴリIDと同じです。

+2

いいえ、列は1つのだけ値が含まれています。 1はどのようにして1、2、3と同じようになりましたか? – Kleinux

+3

この状態がどうなるか説明できますか? '(column = 5 AND column = 8 AND column = 9)' – RichardTheKiwi

+0

@kleinuxこれらは例であり、実際にはアプリケーションによって生成される可能性のあるパラメータであると仮定します。 – jzd

答えて

17

EDIT:OPの編集した質問に一層近似するように自分の答えを修正しました。

select i.MovieName 
    from item i 
     inner join ItemCategory ic 
      on i.item_id = ic.item_id 
    where i.item_id = 55 
     and ic.category_id in ('5','8','9') 
    group by i.MovieName 
    having count(distinct ic.category_id) = 3 
+1

私はこれがOPの後のものだと思って、それらのうちの1つだけでなくカテゴリのすべてを持っている映画を返します。 – Leslie

+0

これはスケールが難しい、つまり動的SQLが必要です(yuk!:) – onedaywhen

+0

これはうまくいくが、かなり大きなDBで1日に300万件を超える検索がある。ほとんどがキャッシュされていますが、これは重い問い合わせになります。 –

-2

値のリストに複数の値がある場合は、その値を簡単に最適化できます。例えば、これ:

AND (column = 5 AND column = 8 AND column = 9) 

は次のようになる。

AND (column = 5 AND 5 = 8 AND 8 = 9) 

(等しいの関係は推移的であるため)。

AND false 

これは明らかにあなたが問い合わせるクエリと同じ結果を示します - そして、実際にはほとんどのデータベースでは非常に高速です。

真剣に、あなたはその質問を言い換えることができますか?

+0

私はOPだけ選択されたオプションのすべての3つを持っている映画を表示したいと思う – Leslie

+0

ええ、編集の後に意味が理にかなって。私が答えを書いたとき、私はそれを信じなかった。 – fdreger

1

あなたはアドホックを使用している場合は、この

select * 
from item_id t0 
left join category_id t1 on t1.itemId=t0.Id and t1.gemres = 5 
left join category_id t2 on t2.itemId=t0.Id and t2.gemres = 8 
left join category_id t3 on t3.itemId=t0.Id and t3.gemres = 9 
where (t1.Id is not null and t2.Id is not null and t3.Id is not null) 
+0

3の引数の数は、単なる例示のためのものです。 1から10までの範囲にすることができます。 –

+0

これは、アドホッククエリを使用している場合にこれが動作するよう書いた理由です。クエリを動的に構築することが期待されます。 – Kleinux

関連する問題