2012-11-17 10 views
11

だが、私はこのようになりますテーブル、email_phone_notesを持っているとしましょうWHEREに複数のペアを持つ行を選択する方法:のMySQL:バルクは句

+-----------------------+--------------+------+-----+---------+-------+ 
| Field     | Type   | Null | Key | Default | Extra | 
+-----------------------+--------------+------+-----+---------+-------+ 
| email     | varchar  | NO | PRI | NULL |  | 
| phone     | varchar  | NO | PRI | NULL |  | 
| notes     | text   | NO |  | 0  |  | 
+-----------------------+--------------+------+-----+---------+-------+ 

ので、各電子メール/電話の組み合わせはユニークですが、あなたは持っている可能性があり異なる電話番号を持つ複数の電子メールアドレスとその逆。これは少し工夫されていますが、それは私のシナリオを反映しています。

私はこのようなクエリを実行したい:私はいくつかのSELECTクエリを作成する必要はありませんので、私は一度に複数のペアをしたいと思い、

SELECT * FROM email_phone_notes  WHERE email = '[email protected]' AND phone = '555-1212'; 

しかし。リクエストされていない誤った電話/メールの組み合わせを返送したくないので、ペアを一緒に保つことも重要です。

私はこのようなことをすることができますが、数百値の可能性があるため、クエリは本当に長くなります。

SELECT * FROM email_phone_notes WHERE ( 
    (email='[email protected]' && phone='555-1212') || 
    (email='[email protected]' && phone='888-1212') || 
    ... 

もっと洗練された解決策がありますか、それとも私はこれに固執すべきですか?ありがとう!

答えて

21

あなたがエレガントなSQL後にしている場合は、行のコンストラクタを使用することができます。

SELECT * FROM email_phone_notes WHERE (email, phone) IN (
    ('[email protected]' , '555-1212'), 
    ('[email protected]', '888-1212') 
    -- etc. 
); 

はしかし、それはすべてのインデックスフレンドリーではありませんし、重大なサイズのテーブルの上に、推奨されません。代わりに、ご希望のペアを持つテーブルを実体化し、あなたのテーブルとその参加することができます:

SELECT * FROM email_phone_notes NATURAL JOIN (
    SELECT '[email protected]' AS email, '555-1212' AS phone 
UNION ALL 
    SELECT '[email protected]', '888-1212' 
-- etc. 
) t; 

もないと事前移入(一時的な)表:

CREATE TEMPORARY TABLE foo (PRIMARY KEY (email, phone)) Engine=MEMORY 
    SELECT email, phone FROM email_phone_notes WHERE FALSE 
; 

INSERT INTO foo 
    (email, phone) 
VALUES 
    ('[email protected]' , '555-1212'), 
    ('[email protected]', '888-1212') 
    -- etc. 
; 

SELECT * FROM email_phone_notes NATURAL JOIN foo; 
+2

すごいそれは素晴らしいSYNTAXです! –

1

あなたはこのようなrow constructorを使用することができます:

SELECT * 
FROM email_phone_notes 
WHERE (email, phone) IN (
    ('[email protected]', '555-1212'), 
    ('[email protected]', '888-1212') 
) 

SQLfiddle example

+1

しかし、悲しいことにインデックスを使用しません。 – eggyal

+1

Curse you、MySQL。 http://sqlfiddle.com/#!2/86c1e/2 – AndreKR

+0

インデックスが小さすぎる(10レコード未満)ため、このテーブルではインデックスが使用されないことに注意してください。興味深い。 – eggyal