88k 行のテーブルからいくつかの統計を取得する必要があります。
行はそれぞれ参照番号を表し、システム内の注文に関連付けられています。1 つの注文で複数の参照番号を持つことができます。
ここで、いくつかの合計、要求された参照番号がいくつあるか、キャンセルされた参照番号がいくつあるかを調べるためにアーカイブしたいと思います。そして、取引ごとに合計をグループ化して一覧表示します。
これは私が行ったことです: (OBS. Kohana Query Builder はクエリに使用されますが、実際の MySQL クエリがどのように見えるかを理解できると思います。そして、純粋な MySQL クエリで答えることができます)
$refs = DB::select('refnumbers.cancelled', 'refnumbers.is_claimed', 'deals.price', 'deals.ID', 'refnumbers.order_id')
->from('refnumbers')
->join('deals')->on('deals.ID', '=', 'refnumbers.deal_id')
->execute()
->as_array();
$total_cancelled = array();
$total_claimed = array();
foreach($refs as $ref)
{
$isProduct = DB::select('product_id')->from('orders_chosenoptions')->where('order_id', '=', $ref['order_id'])->execute()->get('product_id', 0);
if($isProduct > 0)
{
$price = DB::select('price')->from('deals_products')->where('id', '=', $isProduct)
->execute()->get('price', $ref['price']);
}else{
$price = $ref['price'];
}
if($ref['cancelled'] == 1)
{
$total_cancelled[$ref['ID']] += $price;
}else if($ref['is_claimed'] == 1)
{
$total_claimed[$ref['ID']] += $price;
}
}
このコードはすべてクエリに置き換えることができると思いますか? キャンセルされた場合、SUM(deals.price) が 1 の場合 (純粋な mysql でこれを行う方法がわかりません)、is_claimed と同じである可能性があります。
ユーザーが購入した取引が製品取引であり、取引内に異なる価格がある場合、deals.price を信頼できないというもう 1 つの「問題」があります。その場合、deals_products から価格を取得する必要があります見ることができます。
1 つのクエリですべてを実行することは可能ですか? そうでない場合、この php コードを最適化するにはどうすればよいですか?
このコードは永遠に時間がかかり、(タイムアウト設定を高くしても) これらの 88k 行でおそらくタイムアウトになるため、このような解決策を探します。
ありがとう