0

これが私の問題です:

私は3つの列(単純化のために-他に無関係な列があります)と3000行のデータ(単純化のために再び)を持つmySQLデータベースを持っています。

$iCount = count($item_ids);
for($i=0;$i<$iCount;$i++){
    $q="SELECT item_id, value_date FROM $dataTable WHERE value_date >= $sDate AND value_date <= $eDate AND price_disc <> 'NA' AND item_id = '".$item_ids[$i]."' ORDER BY value_date";
    $q=$myConn->query($q);
    if($q->num_rows>0){
        $x=0;
        while($row=$q->fetch_assoc()){
            $iData[$i][0]=$row['item_id'];
            $iData[$i][1][$x]=$row['value_date'];
            $x++;
        }
        $q->free();
    }
    set_time_limit(30);
}

PHP配列を埋めます(ご覧のとおり)。

上記のコードは動作していますが、現在は約 3000 回 (item_id ごとに 1 回) 繰り返されるため、非常にゆっくりと動作します。

現在と同じ形式で配列にデータを収集する方法を探しています (item_id は array[$i][0] で、value_date は array[$i][1][$x] です)。 )、ただし、3000 ではなく単一のクエリで。

注: 完全に必要でない限り、データベースを再編成する必要はありません。

これを行う簡単な方法があると確信しています。前もって感謝します。

編集: IN('.join(item_ids).') を使用して1つのクエリ文字列にすることができることは知っていますが、私が持っているものと同じ次元の配列で結果を取得する方法がわかりません説明された。

4

2 に答える 2

2

使用するIN

$ids = " ('" . implode(item_ids, "','") . "')" ;

$q ="SELECT item_id, value_date ";
$q.=" FROM $dataTable ";
$q.=" WHERE value_date >= $sDate AND value_date <= $eDate AND price_disc <> 'NA' ";
$q.=" AND item_id IN ".$ids ." ORDER BY value_date";
$stmt=$myConn->query($q);
if($stmt->num_rows>0){
    $x=0;
    $i=0;
    while($row=$stmt->fetch_assoc()){
        $iData[$i][0]=$row['item_id'];
        $iData[$i++][1][$x]=$row['value_date'];
        $x++;
    }
    $stmt->free();
}

リクエストがまだ遅い場合は、列にインデックスを作成する必要があります。

CREATE INDEX idx_item_id  ON YOUR_TABLE(item_id);
于 2013-09-24T09:52:12.657 に答える
1

単純なページ要求で 3000 のクエリを実行しています...多すぎます

すべてのアイテム ID を配列に格納します

$stringItemIds = implode(',',$arrayItemsId);

$q="SELECT item_id, value_date FROM $dataTable WHERE value_date >= $sDate AND value_date <= $eDate AND price_disc <> 'NA' AND item_id IN ($stringItemIds) ORDER BY value_date";

その後、クエリを繰り返します。

    $q=$myConn->query($q);
    if($q->num_rows>0){
        $x=0;
        while($row=$q->fetch_assoc()){
            $iData[] = array(
                '0' => $row['item_id'],
                '1' => array('x' => $row['value_date'])
            );
        }
        $q->free();
    }
于 2013-09-24T09:54:45.997 に答える