समस्या यह हो सकती है कि आप जॉइन टेबल पर जहां कंडीशन का उपयोग कर फ़िल्टर कर रहे हैं, जो उन विभाग सेवाओं को भी फ़िल्टर करेगा जिनका जॉइन में कोई मेल नहीं है, फ़िल्टरिंग को जॉइन में ले जाएँ और केवल फ़िल्टर को 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
जोड़कर पहले दृष्टिकोण का उपयोग करना चाहिए। शर्त, यदि आप इसके बजाय इसे रखना चाहते हैं, तो आपको दूसरे दृष्टिकोण का उपयोग करना चाहिए और बाईं ओर के दाईं ओर तालिका को पहले से फ़िल्टर करना चाहिए।