我需要从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行,我寻求这样的解决方案。
由于