'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>)