'e.id' एक स्ट्रिंग स्थिरांक है, इसलिए COUNT('e.id') COUNT(*) . कहने का एक अजीब, भ्रामक तरीका है ।
COUNT(e.id) दूसरी ओर, परिणाम में सभी पंक्तियों की गणना करता है जहां e.id IS NOT NULL . है - चूंकि count() NULL मानों की गणना नहीं करता है।
जैसा कि आप देख सकते हैं, आंतरिक रूप से भी दो अलग-अलग कार्य हैं। Andit ध्यान दिया जाना चाहिए कि count(*) थोड़ा तेज है। तो इसका उपयोग तब तक करें जब तक आपको जरूरत न हो दूसरा संस्करण। संबंधित:
आप इसका विरोध कर सकते हैं:
"लेकिन e.id PRIMARY KEY है core_employments . का , इसलिए इसे परिभाषित किया गया है NOT NULL !"
लेकिन वह सशर्त LEFT JOIN को नजरअंदाज कर देगा आपकी क्वेरी में जो अभी भी NULL . का परिचय देती है आपके NOT NULL में मान कॉलम, जहां शामिल होने की शर्तें पूरी नहीं होती हैं। संबंधित:
उस ने कहा, LEFT [OUTER] JOIN भ्रामक भी है। बाद की स्थिति
having("COUNT(e.id) = 1")
इसे एक सादे [INNER] JOIN . की तरह कार्य करने के लिए बाध्य करता है . एक बार जब आप इसे ठीक कर लेते हैं, तो आप इसे सरल भी कर सकते हैं:
having("COUNT(*) = 1")
और यदि आपको केवल इतना ही ध्यान है कि कम से कम core_employments . में एक संबंधित पंक्ति मौजूद है , having("COUNT(*) >= 1") . में अनुवाद करना , साधारण मामलों में बेहतर (स्पष्ट, तेज) तकनीक एक EXISTS अर्ध-जुड़ना
:
WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)