LS

2013-06-10 8 views
30

के साथ MySQL COUNT जो मैं करना चाहता हूं वह एक स्तंभ है, लेकिन 5 पंक्तियों से अधिक की सीमा के साथ COUNT पंक्तियों की संख्या भी सूचीबद्ध है। तो मेरी क्वेरी है:LS

SELECT COUNT(*), SUM(score) FROM answers WHERE user=1 LIMIT 5 

मैं क्या उम्मीद वापस एक COUNT (*) 5 अप करने के लिए किया गया था (मैं बस मान नहीं कर सकते यह हमेशा मेरे कोड तर्क यह कम से कम 5 जवाब हो सकता है के रूप में में 5 हो जाएगा), के साथ के स्कोर 5 पंक्तियों के स्कोर का योग।

इसके बजाय मुझे लगता है कि मिलान करने वाली पंक्तियों की कुल संख्या (जहां उपयोगकर्ता 1 है) गिनती के रूप में, और उन पंक्तियों के लिए स्कोर का योग है। संख्या न बदलने के लिए कि क्या मैं सीमा 1 या सीमा डाल 5 या सीमित 50.

क्या मेरा मानना ​​है कि इस स्थिति में काम करेंगे यह बजाय

SELECT COUNT(*), SUM(score) FROM (SELECT * FROM answers WHERE user=1 LIMIT 5) AS a 

है लेकिन वह इस तरह के एक सरल प्रश्न के लिए एक छोटे से जटिल लगता है , और जैसा कि यह एक उच्च यातायात लिपि में है, मैं इसे जितना संभव हो उतना कलाकार नहीं बनूंगा।

क्या मुझे कुछ याद आ रही है? मुझे कुछ साल पहले इस बग रिपोर्ट को मिला जो कि "समस्या" http://bugs.mysql.com/bug.php?id=50005 से संबंधित प्रतीत होता है लेकिन मुझे लगता है कि यह वास्तव में एक बग नहीं है?

+4

'LIMIT 5' अधिकतम 5 पंक्तियों पर वापस आ जाएगा। 'COUNT (*) चुनें, उत्तर से एसयूएम (स्कोर) '1 पंक्ति लौटाएगा। 1 <5. आप दूसरी क्वेरी में यह सही है। –

+0

हाँ @ ta.speot.is, मुझे लगता है कि मुझे किसी को यह सत्यापित करने की आवश्यकता है कि मैं कुछ बेवकूफ नहीं कर रहा था। शपथ ले सकती थी कि मुझे जो चाहिए वह करने के लिए एक सरल क्वेरी थी, लेकिन स्पष्ट रूप से नहीं। नेस्टेड क्वेरी में 'select *' के बजाय 'select 1' का उपयोग करके – Lee

+2

सैद्धांतिक रूप से कम मेमोरी उपयोग –

उत्तर

30

यह वास्तव में आपकी क्वेरी कैसे काम करती है और एक सामान्य व्यवहार है। LIMIT का उपयोग करके आप गिनती या राशि को सीमित नहीं करेंगे बल्कि केवल लौटाई गई पंक्तियां ही सीमित करेंगे। तो आपकी क्वेरी आपके LIMIT खंड में बताए गए अनुसार n पंक्तियां वापस कर देगी। और चूंकि आपकी क्वेरी वास्तव में केवल एक पंक्ति लौटाती है, इसलिए (गैर-शून्य) सीमा लागू करने से परिणामों पर कोई प्रभाव नहीं पड़ता है।

हालांकि, आपकी दूसरी क्वेरी अपेक्षित के रूप में काम करेगी और इस समस्या को हल करने का एक स्थापित तरीका है।

+0

ले सकता है I SO टाइमर मुझे एक बार देता है। लेकिन आप सही कह रहे हैं, मुझे लगता है कि मुझे किसी और को इसकी व्याख्या करने के लिए बस इतना चाहिए कि मुझे पता था कि मैं मूर्खतापूर्ण कुछ नहीं कर रहा था। दूसरी क्वेरी काम करती है, और ऐसा करने का एकमात्र तरीका प्रतीत होता है। – Lee

+0

@ देखो यह सही है, मुझे खुशी है कि मैंने आपकी मदद की – Fabio

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