2010-04-12 16 views
8

यदि SELECT SUM(amount) FROM transactions ORDER BY order LIMIT 0, 50 तालिका में पहले 50 रिकॉर्ड के लिए amount फ़ील्ड का योग करता है, तो के बाद सभी रिकॉर्ड पहले 50 के बाद कैसे रिकॉर्ड करते हैं? दूसरे शब्दों में, मैं SELECT SUM(amount) from transactions ORDER BY order LIMIT 50, * जैसे कुछ करना चाहता हूं, लेकिन यह काम नहीं करता है।तालिका के अंत तक ऑफसेट से SUM() कैसे करें?

उत्तर

2

documentation सलाह LIMIT से पीछे नहीं पैरामीटर के रूप में एक अविश्वसनीय बड़ी संख्या में उपयोग करने के लिए:

एक निश्चित से सभी पंक्तियों को पुनः प्राप्त करने के परिणाम सेट के अंत तक ऑफसेट, आप के लिए कुछ बड़ी संख्या में उपयोग कर सकते हैं दूसरा पैरामीटर यह बयान पिछले करने के लिए 96 वां पंक्ति से सभी पंक्तियों को पुन: प्राप्त:

SELECT * FROM tbl LIMIT 95,18446744073709551615; 
+0

इसे स्वीकार करना, क्योंकि यह मेरे प्रश्न को सबसे सीधे संबोधित करता है, लेकिन 'ORDER BY' के साथ मेरी समस्या को इंगित करने के लिए @Quassnoi को धन्यवाद (और +1), – keithjgrant

+0

इस उत्तर का प्रारूप शून्य परिणाम देगा यदि SUM या कुछ अन्य एकत्रीकरण समारोह का उपयोग किया गया था। ऐसा इसलिए है क्योंकि, जैसा कि @Quassnoi नीचे बताता है, एसयूएम को एक सबक्वायरी के रिकॉर्ड # 95 - LARGE_NUMBER पर लागू किया जाएगा जो केवल एक परिणाम लौटाता है। Quassnoi नीचे मूल प्रश्न का सही जवाब देता है। – akgill

7
SELECT SUM(amount) 
FROM (
     SELECT amount 
     FROM transactions 
     ORDER BY 
       order 
     LIMIT 50, 1000000000000 
     ) q 

ध्यान दें कि आपकी मूल क्वेरी:

SELECT SUM(amount) 
FROM transactions 
ORDER BY 
     order 
LIMIT 0, 50 

क्या आप शायद लगता है कि यह करता है नहीं करता है। यह इस के लिए पर्याय बन गया है:

SELECT a_sum, order 
FROM (
     SELECT SUM(amount) AS a_sum, order 
     FROM transactions 
     ) q 
ORDER BY 
     order 
LIMIT 0, 50 

भीतरी क्वेरी (जो आम तौर किसी अन्य इंजन में विफल हो जाएगा लेकिन इसकी GROUP BY विस्तार वाक्य रचना के कारण MySQL में काम करता है) केवल 1 रिकॉर्ड देता है।

ORDER BY और LIMIT तब उस समेकित रिकॉर्ड पर लागू होते हैं, transactions के रिकॉर्ड के लिए नहीं।

+0

यदि आपके पास 1000000000000 से अधिक पंक्तियां हैं तो क्या होगा? – Pyrolistical

+0

उप-प्रश्न के लिए कोई कारण? अनावश्यक लगता है। – keithjgrant

+0

@ पेरोलॉजिकल: फिर आप किसी अन्य इंजन पर स्विच करने पर विचार करते हैं। – Quassnoi

2

शायद एक अधिक कुशल तरीका नहीं है, लेकिन आप अपने तालिका में पंक्तियों की कुल # पुनः प्राप्त करने के पहले एक गिनती क्वेरी चला सकते हैं,:

SELECT count(*) FROM transactions 

सामग्री को एक चर में रखें और उस सीमा का उपयोग LIMIT के लिए आपके दूसरे तर्क के रूप में करें। आप शायद इसे नेस्टेड mysql क्वेरी के रूप में कर सकते हैं।

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