2013-11-15 8 views
6

की हर दूसरी पंक्ति को लौटाना मैं एक ऐप के साथ काम कर रहा हूं जो phpActiveRecord और mySQL का उपयोग सेंसर नेटवर्क से डेटा खींचने और क्लाइंट पर कई flot.js आलेखों पर प्लॉट करने के लिए करता है।एक SQL क्वेरी

ग्राफ़ प्रदर्शित करने वाले डेटा की सीमा को प्रभावित करने के लिए उपयोगकर्ता कई समय-समय पर चयन कर सकते हैं। 2hrs, 24hrs, 3 days and 1 week.

सेंसर प्रत्येक 60 सेकंड में डेटाबेस पर पोस्ट करते हैं, इसलिए ग्राफ को साजिश करते समय क्वेरी now and DATE_SUB(CUR_DATE - INTERVAL ? DAY) के बीच सभी पंक्तियों में खींचती है? या तो 1, 3 या 7 आदि

हालांकि इसके परिणामस्वरूप बड़ी संख्या में पंक्तियों को (60,000 + for the full week!) लौटाया जा रहा है और यह बड़ी देरी और सर्वर त्रुटियों का कारण बन रहा है।

मुझे पता है कि मैं php.ini फ़ाइल में क्वेरी के लिए उपलब्ध अधिकतम मेमोरी को बड़े पैमाने पर बढ़ा सकता हूं, लेकिन यह शायद ही कोई अच्छा समाधान है, और गति के मुद्दे को हल नहीं करता है।

मेरा सवाल यह है कि, क्या कोई तरीका है कि मैं आवश्यक तिथि सीमा से केवल प्रत्येक दूसरी या तीसरी पंक्ति का चयन कर सकता हूं, जो उपयोगकर्ता अंतराल की लंबाई के आधार पर आसानी से चुन सकता है?

सी या जावा में मैं वैकल्पिक पंक्तियों को वापस करने के लिए एक मॉड्यूलो चुनने की तरह कुछ करता हूं लेकिन मैं वर्तमान ढांचे में ऐसा करने का तरीका नहीं सोच सकता।

किसी भी विचार की सराहना की जाएगी। धन्यवाद।

+3

http://stackoverflow.com/questions/858746/how-do-you-select-every-n-th-row-from-mysql –

+0

धन्यवाद जोश, ये बहुत अच्छे लिंक हैं, लेकिन दुर्भाग्य से ऐप किस तरह से है संरचित और गतिशील रूप से जेनरेट किया गया है कि उपयोगकर्ता चर का उपयोग अनिवार्य रूप से प्रश्न से बाहर है। प्रश्न slim.js रूटिंग फ्रेमवर्क द्वारा प्रबंधित किए जाते हैं और सीधे ब्राउज़र पृष्ठ द्वारा नहीं बुलाए जाते हैं। हालांकि मैं इसकी सराहना करता हूं! धन्यवाद। – bisslad

+1

यदि आपकी आईडी बढ़ती है तो आप इसका उपयोग कर सकते हैं (एक "अजीब" जैसा है या 4/8 के एकाधिक हैं और इसलिए अपने WHERE कथन पर) भी: क्या आपने अपनी क्वेरी के लिए कैशिंग का उपयोग करने पर विचार किया है?भले ही आप mysql_result_cache का उपयोग कर सकें, आप अपने प्रदर्शन को बहुत बढ़ाएंगे। –

उत्तर

0
<? 
$row = 1; 
WHILE QUERY { 
    if ($row % 2 == 0) { 
     echo "Yourstuff"; 
    } else { 
     //Nothing 
    } 
    $row++; 
} 
?> 

यह आपको एक solution..maybe आप के लिए एकदम सही एक नहीं के बारे में सोचना और मदद करनी चाहिए, लेकिन मैं इसे मदद करता है आशा है कि ... हर तीसरे उपयोग $ पंक्ति% 3 के लिए इतने पर ...

+1

पर एक नया उपाय आवश्यक नहीं होगा, यह 60,000 कैंडीज को वापस घर (डाटाबेस) से घर लाने और फिर कहने जैसा है नहीं, मुझे केवल हर दूसरे की जरूरत है, बाकी नहीं। उन्हें पहली जगह बाजार (डेटाबेस) से क्यों प्राप्त करें? घर पर (php) –

+0

पर वापस लेने का निर्णय क्यों न लें, मुझे लगता है कि मुझे इस तरह के समाधान का प्रयास करना होगा। उम्मीद थी कि हजारों और छोटे प्रश्नों को उत्पन्न न करें, लेकिन ऐसा करने का एकमात्र तरीका यह हो सकता है। जब मैं इसे प्राप्त करता हूं तो परीक्षण और स्वीकार करूंगा। – bisslad

+0

@ हंकी पंकी: यह एक पूर्ण समाधान नहीं होना चाहिए ... लेकिन केवल एक चीज जो शायद उसे सही तरीके से प्राप्त करने में मदद करे ... एक और समाधान हर पंक्ति के लिए एक प्रश्न बनाना होगा ... इसके लिए आप निरंतर आईडी की आवश्यकता होगी ... लेकिन मुझे नहीं पता कि प्रत्येक पंक्ति के लिए एक क्वेरी तेज हो जाएगी ... –

0

प्रयास करें:

$i = 0; 
foreach($row as $data){ 
    if($i == 1){ 
    //Do whatever with your 2n record 
    $i++; 
    } 
    if($i > 1){$i = 0;} //Reset the counter 
} 
+3

तो आप $ i में वृद्धि कहां करते हैं;) – douwe

+0

हा, अच्छी तरह से देखा गया। क्षमा करें, मेरे उत्तर को सही किया गया – ggdx

+0

ईमानदार होने के लिए, जब तक यह PHP में है, आप पहले ही आधे समस्या को याद कर चुके हैं। हाँ, आप इसे क्लाइंट को भेजने से बचते हैं लेकिन आप अभी भी डेटाबेस पर डिस्क से इसे ला रहे हैं, इसे नेटवर्क पर PHP में स्थानांतरित कर रहे हैं, इसे स्मृति में संग्रहीत कर रहे हैं, आदि ... यह कुछ भी नहीं बल्कि सही समाधान नहीं है – Basic

0

हर दूसरी पंक्ति भी आदर्श समाधान नहीं लौटते। आप कैश का उपयोग कर सकते हैं।

सबसे आसान तरीका आपकी तालिका को किसी अन्य तालिका में कैशिंग कर रहा है। समय-समय पर स्वचालित क्रॉन नौकरी को कॉन्फ़िगर करें।

datas 
datas_cache (Only Results) 

आप और अधिक पेशेवर समाधान आप फाइलों में अपने परिणाम कैश करने के लिए JSON

0

उपयोग कर सकते हैं अंत मैं उपरोक्त निर्दिष्ट पंक्तियों का चयन करने के लिए प्रबंधन के अंत में किया था में जरूरत चाहते हैं।

हालांकि यह समस्या मेरे लिए एक स्वीकार्य समाधान नहीं था इसलिए मैंने पूरी तरह से इस मुद्दे को आज़माने और उससे बचने के लिए अपने ग्राफ सर्वर सर्वर को चलाने और उत्पन्न करने का निर्णय लिया है। ऐसा लगता है कि सर्वर पर इतने सारे डेटा पॉइंट वाले चार्ट उत्पन्न होते हैं और तार को एक HTML5 कैनवास या कुछ ऐसे में दबाते हैं। इसके लिए pChart आज़माने के लिए जा रहे हैं। किसी भी मामले में सभी उत्तरदाताओं के लिए धन्यवाद।

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