优化:总计查询,而不是PHP代码

时间:2013-06-27 23:19:58

标签: php mysql optimization query-optimization

我需要从88k行表中获取一些统计数据。

每行代表一个参考号,它们与系统中的订单相连。一个订单可以有多个参考编号。

现在我想找出一些故事,有多少声明的参考号码,以及有多少被取消的参考号码 - 并按照每笔交易进行分组和列出。

这就是我所做的:( 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相同。

还有一个'问题'就是我们不能相信deal.price如果用户购买的交易是产品交易而且交易中有不同的价格 - 那么我们需要从中获取价格您可以看到deals_products。

是否可以在一个查询中完成所有操作?如果没有,如何优化这个PHP代码?

由于这些代码将花费很长时间并且可能超时(即使使用高超时设置)这些88k行,我寻求这样的解决方案。

由于

0 个答案:

没有答案