यह सवाल काफी पुराना है और एक ही जवाब पहले से ही 160 वोट ...
फिर भी मैं यह स्पष्ट हो जाएगा प्राप्त की: सवाल वास्तव में नहीं के बारे में है कि क्या उर्फ नाम WHERE
खंड में इस्तेमाल किया जा सकता है।
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
एकत्रीकरण है। WHERE
खंड में हम उन मानों को प्रतिबंधित करते हैं जिन्हें हम टेबल से अपने मूल्यों को देखकर चाहते हैं। sum(reviews.rev_rating)
और count(reviews.rev_id)
, हालांकि, वे मान नहीं हैं जो हमें रिकॉर्ड में मिलते हैं; वे मूल्य हैं जिन्हें हम केवल अभिलेखों को एकत्रित करने के बाद प्राप्त करते हैं।
तो WHERE
अनुचित है। हमें HAVING
की आवश्यकता है, क्योंकि हम एकत्रीकरण के बाद परिणाम पंक्तियों को प्रतिबंधित करना चाहते हैं। यह
WHERE avg_rating > 10
है और न ही
WHERE sum(reviews.rev_rating)/count(reviews.rev_id) > 10
इसलिए नहीं हो सकता।
HAVING sum(reviews.rev_rating)/count(reviews.rev_id) > 10
दूसरी ओर संभव है और SQL मानक का अनुपालन करता है। जबकि
HAVING avg_rating > 10
MySQL में केवल संभव है।यह मानक के अनुसार मान्य एसक्यूएल नहीं है, क्योंकि SELECT
खंड HAVING
के बाद निष्पादित किया जाना चाहिए। MySQL दस्तावेज़ों से:
मानक एसक्यूएल के लिए एक और MySQL एक्सटेंशन चुनिंदा सूची में अलियाज्ड अभिव्यक्तियों के लिए हैविंग क्लॉज में संदर्भों को अनुमति देता है।
MySQL विस्तार एकत्रित स्तंभ के लिए HAVING क्लॉज़ में एक उपनाम के उपयोग की अनुमति
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
स्रोत
2017-07-10 14:35:41
अगर मैं अभिव्यक्ति दोहराने, यह मुझसे कहता है: "समूह समारोह के अवैध उपयोग" –
है –
अच्छा स्पष्टीकरण, esp अनुमति देने के लिए इसे स्पष्ट रूप से अपग्रेड करने वाले कार्यों को बनाने के लिए पुन: संशोधित किया गया। "लेकिन जहां एक खंड ... दोहराना .." भाग – th3an0maly