2012-11-17 25 views
11

比方說,我有一個表,email_phone_notes看起來像這樣具有多對行:MySQL的:如何批量選擇在WHERE子句

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

因此,每個郵件/電話組合是唯一的,但你可以有幾個不同的電話號碼的電子郵件地址,反之亦然。這是有點人爲的,但它反映了我的情況。

我想做一個這樣的查詢:

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

但是,我想一下子讓我不必進行多次SELECT查詢做多對。將這兩對保持在一起也很重要,因爲我不想返回未被請求的錯誤電話/電子郵件組合。

我可以做這樣的事情,但對於數百個值的可能性,查詢將會很長。

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

哇,這是偉大的語法! –