2011-10-25 23 views
7

私は電話でMySQLテーブルを持っています。すべての行は1回の通話を意味します。 列は以下のとおりです。MySQLデータ - 電話通話回数を同時にカウントします

start_time 
start_date 
duration 

は私が同時に呼ばれる最大の電話を取得する必要があります。それは電話交換のためのものです。

私の解決策は、2つのタイムスタンプ列timestamp_starttimestamp_endを作成することです。それから私は一日することにより、第2、日によってループ秒を実行して、何かのようにMySQLを尋ねる:

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

それはかなり遅いです。 もっと良い解決策はありますか?ありがとうございました!

EDIT - 私はこの解決方法を使用し、私に適切な結果をもたらします。 SQLレイヤーdibi-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

はい、私はインデックスを持っています。それは大きな改善でした。 Blem:これ以上、感謝します! – Xdg

答えて

5

秒単位で実行するのではなく、各行(phonecall)に対して、その時点で他の通話がアクティブであったかどうかを確認する必要があります。その後、すべての結果を行のIDでグループ化し、どれが最大数になっているかを確認します。したがって、基本的には次のようなものです:

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

タイムスタンプには時刻だけでなく、日付部分も含まれます。そうでなければ、日付と時刻の列を別々にチェックする必要はありません。 –

-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)AS callTime FROM tbl GROUP BY callTime' - 'それはあなたに単一の" time "で最大の呼び出し回数を与えるでしょう。 o_Oこの問題を解決する目的で、日付を連結して連結した結果をグループ化することは意味がありません... – Nemoden

+0

これは、すべての同一時刻をまとめてグループ化しますが、現在のポイントを表示します。同時に開始された時間だけ。謝罪。 –

関連する問題