2008-10-14 14 views
90

मुझे WHERE खंड में उपनाम का उपयोग करने की आवश्यकता है, लेकिन यह मुझे बताता है कि यह एक अज्ञात कॉलम है। क्या इस मुद्दे को हल करने का कोई तरीका है? मुझे ऐसे रिकॉर्ड चुनने की ज़रूरत है जिनमें x से अधिक रेटिंग हो।क्या आप mysql में WHERE क्लॉज में उपनाम का उपयोग कर सकते हैं?

sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating 

उत्तर

182

आप एक HAVING क्लॉज़, जो उपनाम देख सकते हैं इस्तेमाल कर सकते हैं, उदाहरण के लिए: रेटिंग निम्नलिखित उपनाम के रूप में गणना की जाती है

HAVING avg_rating>5 

लेकिन जहां एक खंड में आपको अपनी अभिव्यक्ति दोहराना होगा, उदा।

WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5 

लेकिन! सभी अभिव्यक्तियों की अनुमति नहीं दी जाएगी - एसयूएम जैसे एक समेकित कार्य का उपयोग नहीं करेगा, इस मामले में आपको एक हैविंग क्लॉज का उपयोग करने की आवश्यकता होगी।

MySQL Manual से:

यह एक कहां खंड में एक स्तंभ उर्फ ​​का उल्लेख करने के क्योंकि स्तंभ मान अभी तक जब कहां खंड निष्पादित किया जाता है निर्धारित नहीं किया जा सकता है स्वीकार्य नहीं है। Section B.1.5.4, “Problems with Column Aliases” देखें।

+1

अगर मैं अभिव्यक्ति दोहराने, यह मुझसे कहता है: "समूह समारोह के अवैध उपयोग" –

+3

है –

+0

अच्छा स्पष्टीकरण, esp अनुमति देने के लिए इसे स्पष्ट रूप से अपग्रेड करने वाले कार्यों को बनाने के लिए पुन: संशोधित किया गया। "लेकिन जहां एक खंड ... दोहराना .." भाग – th3an0maly

28

पता नहीं अगर यह mysql में काम करता है लेकिन sqlserver का उपयोग कर आप भी इसे पसंद लपेट कर सकते हैं:

select * from (
    -- your original query 
    select .. sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating 
    from ...) Foo 
where Foo.avg_rating ... 
+2

हां, यह भी MySQL में काम करता है। – fracz

0

यह आपकी क्वेरी स्थिर है, आप इसे एक दृश्य के रूप में तो आप में है कि अन्य नाम का उपयोग कर सकते हैं परिभाषित कर सकते हैं दृश्य पूछते समय जहां खंड।

2

यह सवाल काफी पुराना है और एक ही जवाब पहले से ही 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

संबंधित मुद्दे