0

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 行でおそらくタイムアウトになるため、このような解決策を探します。

ありがとう

4

0 に答える 0