Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

लेफ्ट जॉइन लेफ्ट साइड टेबल से सभी रिकॉर्ड वापस नहीं करता है

समस्या यह हो सकती है कि आप जॉइन टेबल पर जहां कंडीशन का उपयोग कर फ़िल्टर कर रहे हैं, जो उन विभाग सेवाओं को भी फ़िल्टर करेगा जिनका जॉइन में कोई मेल नहीं है, फ़िल्टरिंग को जॉइन में ले जाएँ और केवल फ़िल्टर को d जहां खंड में:

SELECT d.mt_code,
   d.dep_name,
   d.service_name,
   COUNT(t.id)
FROM DepartmentService AS d
LEFT JOIN tbl_outgoing AS t 
  ON d.mt_code = t.depCode 
    AND t.smsc = "mobitelMT"
    AND t.sendDate BETWEEN '2014-07-01' AND '2014-07-02'
WHERE d.service_type = 'MT'
GROUP BY d.mt_code

यह समझाने के लिए कि ऐसा क्यों होता है, मैं आपको बताता हूँ कि आपकी क्वेरी और मेरी क्वेरी के साथ क्या होता है, डेटासेट के रूप में मैं इसका उपयोग करूँगा:

states
 ____ _________ 
| id | state   |
|  1 | Germany |
|  2 | Italy   |
|  3 | Sweden  |
|____|_________|

cities

 ____ ________ ___________ ____________
| id | city   | state_fk  | population |
|  1 | Berlin |        1  |         10 |
|  2 | Milan  |        2  |          5 |
|____|________|___________|____________|

पहले मैं आपके प्रश्न का अध्ययन करूँगा।

SELECT s.id, s.state, c.population, c.city
FROM states s
LEFT JOIN cities c
ON c.state_fk = s.id
WHERE c.population < 10

तो चलिए कदम दर कदम आगे बढ़ते हैं, आप तीन राज्यों का चयन करते हैं, जो समाप्त होने वाले शहरों के साथ जुड़ते हैं:

 ____ _________ ____________ ________
| id | state   | population | city   |
|  1 | Germany |         10 | Berlin |
|  2 | Italy   |          5 | Milan  |
|  3 | Sweden  |       NULL | NULL   |
|____|_________|____________|________|

आप WHERE c.population < 10 . का उपयोग करके जनसंख्या को फ़िल्टर करते हैं , इस बिंदु पर आप इसके साथ बाएं हैं:

 ____ _________ ____________ ________
| id | state   | population | city   |
|  2 | Italy   |          5 | Milan  |
|____|_________|____________|________|

आपने जर्मनी को खो दिया क्योंकि बर्लिन की आबादी 10 थी लेकिन आपने स्वीडन को भी खो दिया जिसमें NULL था, अगर आप नल को रखना चाहते थे तो आपको इसे क्वेरी में निर्दिष्ट करना चाहिए था:

WHERE (c.population < 10 OR IS NULL c.population)

कौन सा रिटर्न:

 ____ _________ ____________ ________
| id | state   | population | city   |
|  2 | Italy   |          5 | Milan  |
|  3 | Sweden  |       NULL | NULL   |
|____|_________|____________|________|

अब मेरी क्वेरी:

SELECT s.id, s.state, c.population, c.city
FROM states s
LEFT JOIN cities c
ON c.state_fk = s.id
  AND c.population < 10

दोनों में शामिल होने से पहले, हम टेबल शहरों को फ़िल्टर करते हैं (AND c.population < 10 . का उपयोग करके) ON . के बाद की स्थिति ), जो शेष है वह है:

 ____ ________ ___________ ____________
| id | city   | state_fk  | population |
|  2 | Milan  |        2  |          5 |
|____|________|___________|____________|

क्योंकि मिलान एकमात्र ऐसा शहर है जिसकी जनसंख्या 10 से कम है, अभी हम दो तालिकाओं में शामिल हो सकते हैं:

 ____ _________ ____________ ________
| id | state   | population | city   |
|  1 | Germany |       NULL | NULL   |
|  2 | Italy   |          5 | Milan  |
|  3 | Sweden  |       NULL | NULL   |
|____|_________|____________|________|

जैसा कि आप देख सकते हैं कि बाईं तालिका का डेटा रहता है क्योंकि फ़िल्टरिंग शर्त केवल लागू की गई थी शहरों की मेज पर।

आप जो हासिल करना चाहते हैं उसके आधार पर परिणाम सेट बदलता है, उदाहरण के लिए यदि आप जर्मनी को फ़िल्टर करना चाहते हैं क्योंकि बर्लिन की आबादी 10 से कम है और स्वीडन को रखें तो आपको IS NULL जोड़कर पहले दृष्टिकोण का उपयोग करना चाहिए। शर्त, यदि आप इसके बजाय इसे रखना चाहते हैं, तो आपको दूसरे दृष्टिकोण का उपयोग करना चाहिए और बाईं ओर के दाईं ओर तालिका को पहले से फ़िल्टर करना चाहिए।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL, जो अधिक कुशल लॉन्गटेक्स्ट, टेक्स्ट या ब्लॉब है? सम्मिलित दक्षता में सुधार

  2. मैं एक स्थानीय यूनिक्स सॉकेट को इनसेट सॉकेट में कैसे मैप कर सकता हूं?

  3. डेटाबेस डिज़ाइन:बहुभाषी साइट का समर्थन कैसे करें?

  4. MySQL जॉइन NULL फ़ील्ड लौटाता है

  5. गलत पूर्णांक मान:''पंक्ति 1 पर कॉलम 'आईडी' के लिए''