2017-07-27 6 views
1

すべてのメンバーには、データベースに複数のレコードが格納されています。私はすべてのユーザーのために列を合計し、別の列から最高値または最低値を取得する必要があります。テーブルには100,000以上のレコードがあり、1人のユーザーがテーブルに2kを超えるレコードを持つ可能性があります。100kレコードテーブルを照会すると、実行時間を超えました

私はこの試みた:

$query = $mysqli->query("SELECT DISTINCT `id` FROM `table`"); 

if($query){ 
    $IDs = new SplFixedArray($query->num_rows); 
    $IDs = $query->fetch_all(); 
    unset($query, $row); 


    set_time_limit(300); 
    foreach ($IDs as $key => $value) { 
    $query = $mysqli->query("SELECT SUM(price), dtime FROM `table` WHERE `id` = '".$value[0]."' ORDER BY dtime DESC"); 
    if($query){ 
     $row = $query->fetch_assoc(); 
     print_r($row); 
    } 
    } 

をしかし、実際に300にこれをやって適切な方法を制限時間を設定していますか?私は準備されたステートメントを試してみました。ループ内でIDを割り当てるだけでした。私のようにうまく動かないものもあります。

+0

質問には意味がありません。データベーステーブルスキーマ、サンプルデータ、および望ましい結果についてのコンテキストを提供してください。 – fubar

答えて

1

100kのレコードは実際にはそれほど多くありません。このクエリが5分以上かかる理由はありません。

個別のIDリストを取得して反復処理する代わりに、IDごとにこれらの値を照会する代わりに、すべてを一度にすべて実行し、結果を繰り返して必要な処理を行う方がよいでしょう。

select 
    `id`, 
    sum(`price`) as `sum_price`, 
    min(`dtime`) as `min_dtime`, 
    max(`dtime`) as `max_dtime` 
from 
    `table` 
group by 
    `id` 

(これはあなたがの最小値と最大値を取得する必要があり、「他のフィールドは」dtimeであると仮定している)

私もPHP側に強いないんだけど、SQLの観点から、このようにするのははるかに高速です。

+0

私はジェフが正しいと思います。 100,000クエリには時間がかかりますが、MySQLでは非常に迅速に処理されます。 – RockwoodON

関連する問題