2010-12-20 15 views
4

のペアのの列が特定のセットに含まれる行に対してクエリを実行するMySqlテーブルがあります。さて、私がペアを(F1、F2)は( 'A' 30)のいずれかであるか( 'B' の行を抽出したい複数の列によるSQLのフィルタリング

id | f1 | f2 
-------------  
1 | 'a' | 20 
2 | 'b' | 20 
3 | 'a' | 30 
4 | 'b' | 20 
5 | 'c' | 20 

:たとえば、私のテーブルはこのようになります を言います、20)、すなわち行2,3,4。私はフェッチする多くのペアがあるかもしれないので、 'IN'スタイルのフィルターを使ってやりたいと思います。私はのような何かしようとした場合:

SELECT * FROM my_table WHERE f1 IN ('a','b') AND f2 IN (30, 20)

私がIN句でF1及びF2に指定された値のデカルト積を取得し、F1 =「A」または「B」のすべての可能な組み合わせで行、すなわち、f2 = 30,20となるので、行1も選択される。唯一

任意のアイデアが:-)、有効なSQL構文の

SELECT * FROM my_table WHERE (f1,f2) IN (('a',30), ('b',20))

:要するに

、私はだようなものが必要?

答えて

4

これはです。有効な構文はです。

あなたはそれを好きではない場合は、いくつかの他の選択肢は以下のとおりです。

SELECT * FROM my_table 
WHERE (f1, f2) = ('a', 30) 
OR (f1, f2) = ('b', 20) 

または結合を使用して:

SELECT * 
FROM my_table T1 
(
    SELECT 'a' AS f1, 30 AS f2 
    UNION ALL 
    SELECT 'b', 20 
) T2 
ON T1.f1 = T2.f1 AND T1.f2 = T2.f2 
+2

LOL、私は有効な構文all al ong。 MySqlで検証されます。ありがとう! – bavaza

+0

ステークスを上げましょう:列(f1、f2)にインデックスがあるとします。 EXPLAIN句を使用すると、MySqlは単一の比較(たとえば(f1、f2)=( 'a'、30))にインデックスを使用しますが、 'IN'構文では使用しません。何かご意見は? – bavaza

+0

@bavaza:面白い質問のようです。私は新しい質問(コメントではありません)として投稿して、より多くの人に見られるようにすることをお勧めします。 –

0
SELECT * FROM my_table WHERE (f1= 'a' AND f2=30) OR (f1='b' AND f2=20); 
+0

ORの代わりにANDが必要な場合はどうすればいいですか? – Akhil

0

荒いが、実用的な方法は、文字列の連結を使用することです。

SELECT * 
FROM MyTable 
WHERE CONCAT(f1, '_', f2) IN ('a_30', 'b_20') 
+1

は、111が{1,11}または{11,1}を意味する可能性もあるため潜在的に危険です。 – Ronnis

+0

右、 'CONCAT'の' _'を忘れました。もちろん、f1もf2も '_'を含んではいけません! – Don

関連する問題