2012-04-11 15 views
7

पर मैच चाहिए मैं प्रश्न हैं:Mysql कहाँ ... में ... और जहां ... में ... केवल एक ही सूचकांक

SELECT * FROM `users` 
WHERE (`firstname` LIKE 'Luke' AND `lastname` LIKE 'Skywalker') OR 
(`firstname` LIKE 'Foo' AND `lastname` LIKE 'Bar') OR 
(`firstname` LIKE 'Tom' AND `lastname` LIKE 'Turner'); 

लेकिन मैं इसे थोड़ा अधिक पठनीय बनाने के लिए चाहते हैं एक जहां का उपयोग करके ... में ... मैं

SELECT * FROM users 
WHERE `firstname` 
    IN ('Luke','Foo','Tom') AND `lastname` IN ('Skywalker','Bar','Turner'); 

की कोशिश की लेकिन दुर्भाग्य से यह भी "Tom Skywalker", "Foo Turner" से मिलान करेगा और सभी घुलमिल आप बंद सोच सकते हैं।

मुझे पहले और अंतिम नाम (शायद डीओबी जैसे अधिक फ़ील्ड) पर चयन करना है क्योंकि मुझे बाहरी एपीआई से डेटा मिल रहा है और मुझे यह जांचना है कि ये नाम हमारे सिस्टम में हैं या नहीं।

+0

आपकी 'उपयोगकर्ता' तालिका में डेटा का स्तर क्या है और बाहरी API से पंक्तियों की संख्या आपको तुलना करने की आवश्यकता होगी? पंक्तियों की 100? 50,000 पंक्तियां? – mellamokb

+0

मैं बाहरी एपीआई से 1000 नाम वापस प्राप्त कर सकता हूं (मैं अपने डेटाबेस से उपयोगकर्ताओं के साथ फेसबुक दोस्तों से मेल खाना चाहता हूं) मेरा स्वयं का डेटाबेस 10000 पंक्तियां प्राप्त कर सकता है (यह वर्तमान में एक परीक्षण फेज में है, लेकिन मैं अनुकूलित करना चाहता हूं मेरे सभी एसक्यूएल क्वेरी शुरुआती चरण में हैं) – Werring

उत्तर

4
SELECT * 
FROM users 
WHERE (firstname, lastname) 
     IN (('Luke', 'Skywalker') 
     , ('Foo' , 'Bar') 
     , ('Tom' , 'Turner') 
     ) 
; 
+1

+1, मुझे यह वाक्यविन्यास नहीं पता था – safarov

+0

@safarov: MySQL, Postgres और Oracle 11g में मान्य। एसक्यूएल-सर्वर में नहीं। –

3

आप उन्हें concat के साथ गठबंधन कर सकते हैं:

WHERE concat(`firstname`,'-',`lastname`) 
    IN ('Luke-Skywalker', 'Foo-Bar', 'Tom-Turner'); 
+2

इस समाधान के साथ समस्या यह है कि यह काफी धीमा हो जाएगा –

+1

यह अधिक पठनीय हो सकता है लेकिन धीमा भी होगा। –

+0

अच्छा बिंदु। मैंने प्रश्न पर एक स्पष्टीकरण टिप्पणी जोड़ा है। यदि डेटासेट छोटा है, तो मैं प्रदर्शन के लिए पठनीयता पसंद करूंगा। – mellamokb

4

वाइल्डकार्ड के बिना LIKE ऑपरेटर का उपयोग करना ज्यादा मतलब नहीं है। मुझे लगता है कि आपको = का उपयोग करना चाहिए, खासकर अगर आपको check if those names are in our system करना है।

SELECT * FROM users 
WHERE (firstname = 'Luke' AND lastname = 'Skywalker') OR 
     (firstname = 'Foo' AND lastname = 'Bar') OR 
     (firstname = 'Tom' AND lastname = 'Turner') 

आप एक IN ऑपरेटर का उपयोग करते हैं, जैसा कि आप ने कहा, विभिन्न संयोजनों से मेल खाएगी। मुझे लगता है कि पिछला उदाहरण उनकी तुलना करने का सबसे तेज़ तरीका होना चाहिए।

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