क्या आप mysql में WHERE क्लॉज में एक अन्य नाम का उपयोग कर सकते हैं?


121

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

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

जवाबों:


229

आप एक HAVING क्लॉज का उपयोग कर सकते हैं , जो कि उपनामों को देख सकता है , जैसे

 HAVING avg_rating>5

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

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

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

से MySQL मैनुअल :

WHERE क्लॉज में कॉलम एलियास को संदर्भित करने की अनुमति नहीं है, क्योंकि WHERE क्लॉज निष्पादित होने पर कॉलम मान अभी तक निर्धारित नहीं किया जा सकता है। अनुभाग B.1.5.4, "कॉलम उपनामों के साथ समस्याएं" देखें ।


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

3
यह स्पष्ट करने के लिए पुन: पेश किया है कि एग्रेगेटिंग फ़ंक्शंस को अनुमति न दी जाए
पॉल डिक्सन

अच्छी व्याख्या, esp। "लेकिन जहां एक खंड में ... फिर से .." भाग
th3an0maly

4
यह एक अच्छा जवाब है, लेकिन कृपया प्रदर्शन के HAVINGबाद के आंकड़ों पर विचार करने के बाद निष्पादन पर विचार करें और WHEREपहले निष्पादित करें।
StockB

आप WHERE क्लॉज में कुल कार्यों का उपयोग नहीं कर सकते हैं। जहां खंड एक बार में पंक्तियों को फिल्टर करता है, पूरे समूह को नहीं।
बिल करविन

33

डननो अगर यह 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 ...

6

यह प्रश्न काफी पुराना है और एक उत्तर में पहले से ही 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 में संभव है। यह मानक के अनुसार मान्य SQL नहीं है, क्योंकि SELECTक्लॉज़ के बाद निष्पादित होने वाला है HAVING। MySQL डॉक्स से:

मानक SQL में एक और MySQL एक्सटेंशन चयन सूची में अन्य अभिव्यक्तियों को HAVING क्लॉज में संदर्भों की अनुमति देता है।

MySQL एक्सटेंशन एकत्रित कॉलम के लिए HAVING क्लॉज में एक अन्य नाम के उपयोग की अनुमति देता है

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html


0

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


0
SELECT * FROM (SELECT customer_Id AS 'custId', gender, age FROM customer
    WHERE  gender = 'F') AS c
WHERE c.custId = 100;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.