2011-10-25 7 views
7

मेरे पास फोन कॉल के साथ एक MySQL तालिका है। प्रत्येक पंक्ति का मतलब एक फोन कॉल है। कॉलम हैं:MySQL डेटा - एक ही समय में फोन कॉल की संख्या

start_time 
start_date 
duration 

मैं एक अधिकतम फोन कॉल एक ही समय में कहा जाता है पाने के लिए की जरूरत है। यह टेलीफोन एक्सचेंज आयाम की वजह से है।

मेरा समाधान दो टाइमस्टैम्प कॉलम timestamp_start और timestamp_end बनाना है। तब मैं दूसरे, दिन-ब-एक पाश दूसरा दिन से चलाने के लिए और की तरह MySQL कुछ पूछना:

SELECT Count(*) FROM tbl WHERE start_date IN (thisday, secondday) AND "this_second_checking" BETWEEN timestamp_start AND timestamp_end; 

यह काफी धीमी है। क्या कोई बेहतर समाधान है? धन्यवाद!

संपादित करें - मैं इस समाधान का उपयोग करता हूं और यह मुझे उचित परिणाम देता है। एसक्यूएल परत डीबीआई - http://dibiphp.com/cs/quick-start का उपयोग किया जाता है।

$starts = dibi::query("SELECT ts_start, ts_end FROM " . $tblname . " GROUP BY ts_start"); 
if(count($starts) > 0): 
    foreach ($starts as $row) { 
    if(isset($result)) unset($result); 
    $result = dibi::query('SELECT Count(*) FROM ' . $tblname . ' WHERE "'.$row->ts_start.'" BETWEEN ts_start AND ts_end'); 
    $num = $result->fetchSingle(); 
    if($total_max < $num): 
     $total_max = $num; 
    endif;  
    } 
endif; 
echo "Total MAX: " . $total_max; 
+0

आपको केवल यह जांचने की आवश्यकता है कि कितने लोग चल रहे हैं, कितने चल रहे हैं, हर दूसरे – Blem

+0

की जांच करने की आवश्यकता नहीं है क्या आपको start_date, timestamp_start और timestamp_end पर अनुक्रमणिका मिली है? – pgl

+0

हां, मेरे पास इंडेक्स हैं। यह एक बड़ा सुधार था। ब्लेम: मुझे लगता है कि, धन्यवाद! – Xdg

उत्तर

5

इसे दूसरी बार चलाने के बजाए, आपको प्रत्येक पंक्ति (फोनकॉल) के लिए देखना चाहिए कि उस समय अन्य फोन कॉल सक्रिय थे। इसके बाद आप पंक्ति के आईडी द्वारा सभी परिणामों को समूहित करते हैं, और जांचें कि अधिकतम गणना किसके पास है। तो मूल रूप से इस तरह कुछ:

SELECT MAX(calls.count) 
FROM (
    SELECT a.id, COUNT(*) AS count 
    FROM tbl AS a 
    INNER JOIN tbl AS b ON (
     (b.timestamp_start BETWEEN a.timestamp_start AND a.timestamp_end) 
     OR 
     (b.timestamp_end BETWEEN a.timestamp_start AND a.timestamp_end) 
    ) 
    GROUP BY a.id 
) AS calls 

टाइमस्टैम्प कॉलम पर एक इंडेक्स बनाना भी मदद करेगा।

+0

आप थोड़ा तेज़ हैं :) +1 – Nemoden

+0

यह मुझे मेरे पहले एल्गोरिदम के समान परिणाम नहीं देता है। शायद मुझे अपने कार्यक्रम में कुछ त्रुटि मिली है। मैं अगले 3 घंटों में इसकी समीक्षा करता हूं। – Xdg

+0

टाइमस्टैम्प में तारीख का हिस्सा शामिल है, न केवल समय, है ना? यदि नहीं, तो उन्हें चाहिए, इस तरह आपको अलग-अलग तारीख _and_ समय कॉलम की जांच करने की आवश्यकता नहीं है। –

-1

के बारे में कैसे:

SELECT MAX(callCount) FROM (SELECT COUNT(duration) AS callCount, CONCAT(start_date,start_time) AS callTime FROM tbl GROUP BY callTime) 

कि आप एक ही "समय" में कॉल की अधिकतम संख्या देना होगा। मान लें कि start_date और start_time तार हैं। यदि वे पूर्णांक समय हैं, तो आप शायद इसे कुछ हद तक अनुकूलित कर सकते हैं।

+0

'CONCAT (start_date, start_time) कॉलटाइम द्वारा tbl ग्रुप से कॉल कॉल के रूप में -' इससे आपको एक ही समय में कॉल की अधिकतम संख्या मिल जाएगी। '- वास्तव में? o_O Concat'ing Concat'ing संगत परिणाम द्वारा दिनांक और समूहकरण इस मुद्दे को हल करने के उद्देश्य से मुझे कोई समझ नहीं आता है ... – Nemoden

+0

यह सभी समान समयों को एक साथ समूहित करेगा, हालांकि अब मैं आपका बिंदु देखता हूं - यह ओवरराइपिंग समय अवधि नहीं करता है, केवल एक साथ समय शुरू किया। क्षमा याचना। –

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