2009-04-15 22 views
46

मैं एक MySQL क्वेरी कि दो तालिकाओंMySQL में शामिल नहीं कहाँ मौजूद है

  • मतदाता
  • परिवारों वे voters.household_id पर शामिल होने और

    household.id मैं क्या करने की जरूरत अब क्या मिलती है इसे संशोधित करना है जहां मतदाता तालिका एक तीसरी तालिका में शामिल हो जाती है जिसे उन्मूलन कहा जाता है, वोटर.आईडी और उन्मूलन.वोटर_आईडी के साथ, कैच कितना है कि मैं मतदाता तालिका में किसी भी रिकॉर्ड को बाहर करना चाहता हूं जिसमें उन्मूलन में एक समान रिकॉर्ड है तालिका। मैं ऐसा करने के लिए एक प्रश्न कैसे तैयार करूं?

यह मेरा वर्तमान क्वेरी है

SELECT `voter`.`ID`, `voter`.`Last_Name`, `voter`.`First_Name`, 
     `voter`.`Middle_Name`, `voter`.`Age`, `voter`.`Sex`, 
     `voter`.`Party`, `voter`.`Demo`, `voter`.`PV`, 
     `household`.`Address`, `household`.`City`, `household`.`Zip` 
FROM (`voter`) 
JOIN `household` ON `voter`.`House_ID`=`household`.`id` 
WHERE `CT` = '5' 
AND `Precnum` = 'CTY3' 
AND `Last_Name` LIKE '%Cumbee%' 
AND `First_Name` LIKE '%John%' 
ORDER BY `Last_Name` ASC 
LIMIT 30 

उत्तर

122

मैं शायद का उपयोग करेंगे एक वाम में शामिल हों, जो पंक्तियाँ वापस आ जाएगी कोई मिलान नहीं है, भले ही, और फिर आप से कोई मुकाबला नहीं के साथ ही पंक्तियों का चयन कर सकते हैं एनयूएलएस की जांच

तो, कुछ की तरह:

SELECT V.* 
FROM voter V LEFT JOIN elimination E ON V.id = E.voter_id 
WHERE E.voter_id IS NULL 

चाहे कि कम या ज्यादा एक सबक्वेरी का उपयोग करने से कुशल है अनुकूलन, अनुक्रमित पर निर्भर करता है, इसके संभावित मतदाता प्रति एक से अधिक उन्मूलन, आदि के लिए कि क्या

+8

+1 उप प्रश्नों की तुलना में तेज़ी से लौटाता है – ravi404

+1

+1 उच्च लोड पर बहुत तेज है तो उप-प्रश्न + यदि यू उप-प्रश्नों के बजाय जॉइन कर सकता है - बस जॉइन करें वे एनालिज़र के लिए बहुत आसान हैं। एक और उपयोगी उदाहरण, यू सही परिणाम में कुछ पंक्तियां हैं या यदि कोई नहीं है तो यू परिणाम प्राप्त करना चाह सकता है: 'वी चुनें * * मतदाता वी बाएं जॉइन उन्मूलन ई से V.id = E.voter_id या E .voter_id IS NULL पूर्व है .: यदि यू बाईं ओर से प्रत्येक पंक्ति के लिए सही तालिका में सभी रिकॉर्ड स्टोर नहीं करना चाहता है। –

4

मैं का उपयोग करेंगे एक 'जहां नहीं मौजूद है' - आप अपने शीर्षक में सुझाव है बिल्कुल के रूप में:

SELECT `voter`.`ID`, `voter`.`Last_Name`, `voter`.`First_Name`, 
     `voter`.`Middle_Name`, `voter`.`Age`, `voter`.`Sex`, 
     `voter`.`Party`, `voter`.`Demo`, `voter`.`PV`, 
     `household`.`Address`, `household`.`City`, `household`.`Zip` 
FROM (`voter`) 
JOIN `household` ON `voter`.`House_ID`=`household`.`id` 
WHERE `CT` = '5' 
AND `Precnum` = 'CTY3' 
AND `Last_Name` LIKE '%Cumbee%' 
AND `First_Name` LIKE '%John%' 

AND NOT EXISTS (
    SELECT * FROM `elimination` 
    WHERE `elimination`.`voter_id` = `voter`.`ID` 
) 

ORDER BY `Last_Name` ASC 
LIMIT 30 

मामूली तेजी एक बाएं कर की तुलना में हो सकता है (बेशक में शामिल होने, के आधार पर हो सकता है कि आपकी अनुक्रमणिका, आपकी तालिकाओं की कार्डिनिटी, आदि), और लगभग निश्चित रूप से अधिक IN का उपयोग करने से तेज़ है।

+0

इसके लिए धन्यवाद - मेरे लिए निश्चित रूप से तेज़ था। – spidie

15
+2

इस आलेख का निष्कर्ष: "यही कारण है कि MySQL में अनुपलब्ध मानों की खोज करने का सबसे अच्छा तरीका एक बाएं जॉइन/IS NULL या EXISTS के बजाय नहीं है।" – marcovtwout

+3

लिंक केवल उत्तर = खराब – Andrew

+0

हालांकि संबंधित नहीं है, लेकिन मेरे ढांचे के लिए एक ढांचा (लैरावेल) जहां नहीं कर रहा है, जहां क्वेरी नहीं है – Tebe

1

वहाँ ऐसा करने के लिए तीन संभावित तरीके हैं।

  1. विकल्प
 
     SELECT lt.* FROM table_left l 
     LEFT JOIN 
      table_right r 
     ON  rt.value = lt.value 
     WHERE rt.value IS NULL 
  1. विकल्प
 
     SELECT lt.* FROM table_left l 
     WHERE lt.value NOT IN 
     (
     SELECT value 
     FROM table_right r 
     ) 
  1. विकल्प
 
     SELECT lt.* FROM table_left l 
     WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM table_right r 
     WHERE rt.value = lt.value 
     ) 
संबंधित मुद्दे