2012-11-17 13 views
11

चलो कहते हैं कि मैं एक मेज, email_phone_notes है कि इस तरह दिखता है चलो कई जोड़े के साथ पंक्तियों का चयन करने के लिए:MySQL: कैसे थोक में कहां खंड

+-----------------------+--------------+------+-----+---------+-------+ 
| 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

आप सुरुचिपूर्ण एसक्यूएल के बाद कर रहे हैं, तो आप पंक्ति कंस्ट्रक्टर्स इस्तेमाल कर सकते हैं:

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

आपको अभिशाप, MySQL। खैर, मूल व्यक्ति न तो लगता है: http://sqlfiddle.com/#!2/86c1e/2 – AndreKR

+0

ध्यान रखें कि उस तालिका पर किसी भी इंडेक्स का उपयोग नहीं किया जाएगा, क्योंकि यह बहुत छोटा है (10 से कम रिकॉर्ड)। – eggyal

संबंधित मुद्दे