2013-06-14 4 views
5

तो मैं एक तरह से यहाँ स्टम्प्ड रहा हूँ, मैं वहाँ इस तरह एक क्वेरी चलाने के लिए किसी भी तरह से है कि अगर यहसीमा एसक्यूएल

+-----------+------+ 
| Timestamp | Size | 
+-----------+------+ 
| 1-1-13 + 10.3 + 
+-----------+------+ 
| 1-3-13 + 6.7 + 
+-----------+------+ 
| 1-5-13 + 3.0 + 
+-----------+------+ 
| 1-9-13 + 11.4 + 
+-----------+------+ 

की तरह एक मेज सेटअप और मैं सोच रहा हूँ है

SELECT * FROM table ORDER BY timestamp ASC LIMIT BY (SUM(size) <= 20.0);

यह पहली तीन पंक्तियों हड़पने चाहिए, क्योंकि पहले 3 पंक्तियों की में आकार की राशि 20. हालांकि है, यह हमेशा 3 पंक्तियों कि 20 के बराबर कभी कभी पहली पंक्ति हो सकता है हो सकता है नहीं हो सकता है 20 का मूल्य है, और उस स्थिति में, इसे केवल पहले को पकड़ना चाहिए।

मुझे पहले से ही पता है कि प्रश्न चलाने के बाद PHP में योग की गणना करना संभव है, लेकिन मैं इसे केवल MySQL के साथ पूरा करने की कोशिश कर रहा हूं।

+0

तो तुम एक चल कुल करना चाहते हैं? –

+0

एएनएसआई एसक्यूएल में आप मानदंडों के आधार पर कुछ तालिका (संबंध) की पंक्तियों का चयन करते हैं जो आउटपुट के प्रत्येक सिंगल पंक्ति के लिए मेल खाते हैं। आपके उदाहरण में, मानदंड प्रत्येक नई पंक्ति के साथ बदलता है। निश्चित नहीं है, लेकिन मुझे लगता है कि इसे पीएल/एसक्यूएल फ़ंक्शन की आवश्यकता होगी। नोट करें कि ऑर्डर कैसे काम करता है - सबक्वायरी के उपयोग के आधार पर, आपको अलग-अलग परिणाम मिलेंगे, भले ही आप आउटपुट को सॉर्ट करना चाहते हैं, या इनपुट जो आपकी हालत के तहत मेल खाना है, और ORDER का उपयोग इस तरह नहीं किया जाना चाहिए। LIMIT (या OFFSET) को अभिव्यक्ति द्वारा नहीं, आउटपुट पर पंक्तियों की सरल सीमा संख्या के लिए उपयोग किया जाना चाहिए। –

उत्तर

3

आप चल रहे एक कुल, और सीमा पर आधारित है कि जोड़ना चाहते हैं, तो निम्न कार्य करना चाहिए:

SET @runtot:=0; 
SELECT 
    q1.t, 
    q1.s, 
    (@runtot := @runtot + q1.s) AS rt 
FROM 
    (SELECT Date AS t, 
    SIZE AS s 
    FROM Table1 
    ORDER BY Date 
    ) AS q1 
WHERE @runtot + q1.s <= 20 

संपादित करें: डेमो यहाँ - SQL Fiddle

+0

थोड़ा सा शोध करने के बाद बाहर निकलता है, आप वास्तव में सही हैं। एक रनिंग कुल की गणना करना शामिल होने से बेहतर प्रदर्शन करता है। जवाब के लिए धन्यवाद! – garetmckinley

4
SELECT * FROM ints ORDER BY i; 
+---+ 
| i | 
+---+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 

SELECT x.* ,SUM(y.i) FROM ints x JOIN ints y ON y.i <= x.i GROUP BY x.i; 
+---+----------+ 
| i | SUM(y.i) | 
+---+----------+ 
| 0 |  0 | 
| 1 |  1 | 
| 2 |  3 | 
| 3 |  6 | 
| 4 |  10 | 
| 5 |  15 | 
| 6 |  21 | 
| 7 |  28 | 
| 8 |  36 | 
| 9 |  45 | 
+---+----------+ 

SELECT x.* ,SUM(y.i) FROM ints x JOIN ints y ON y.i <= x.i GROUP BY x.i HAVING SUM(y.i) <= 20; 
+---+----------+ 
| i | SUM(y.i) | 
+---+----------+ 
| 0 |  0 | 
| 1 |  1 | 
| 2 |  3 | 
| 3 |  6 | 
| 4 |  10 | 
| 5 |  15 | 
+---+----------+ 
+0

मैं सबक्वायरी द्वारा समस्या को हल करने का प्रयास कर रहा था, शामिल होना इतना बेहतर और पठनीय है। +1 – Marcassin

+0

वाह, महान जवाब। क्या ऐसा करने में कोई प्रदर्शन समस्या है? – garetmckinley

+0

चर द्वारा कुल रनिंग एक आत्म जॉइन के ऊपरी हिस्से को बचाता है। –

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