从MySQL中获取正确的价格列而无需额外的查询和php来完成它

时间:2013-11-19 12:16:23

标签: php mysql

遵循此内存限制问题:

Grabbing 190k rows from MySQL using PHP, blank page? Memory or buffer?

我今天达到内存限制的一个重要原因是因为这个脚本:

当我抓住参考号码(我的申请中有成本)时,我想抓住价格(费用是多少)。

参考编号价格可以在deal.price中找到,但如果参考编号/订单是产品,我需要在deals_products.price中找到价格。

以下是我的查询:

SELECT `refnumbers`.`refno`, `deals`.`price`, `refnumbers`.`order_id` FROM `refnumbers` JOIN `deals` ON (`deals`.`ID` = `refnumbers`.`deal_id`) 

然后,为了得到这个价格,我总是需要这段代码(我希望你帮忙,删除所有内容都可以在查询中找到)

foreach($refnumbers 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');

    }else{
        $price = $ref['price'];

    }
}

(我正在使用Kohana查询生成器,但查询应该是可读的,以了解最新情况)

所以你可以看到这是非常无效的,1)我运行一个查询,2)我遍历每一行并运行两个查询,以确保我得到正确的价格。

当我通过190k行时,它基本上运行2x190k单个查询作为额外的

我怎样才能跳过这个,并且从第一个查询开始就有正确的价格?

任何答案都表示赞赏。

注意我无法修改数据库设计结构。

更新:

我已成功使用此查询:

SELECT `refnumbers`.`refno`, 
CASE WHEN orders_chosenoptions.order_id IS NOT NULL
THEN (SELECT price FROM deals_products WHERE id = orders_chosenoptions.product_id)
ELSE deals.price
END AS price, 
`refnumbers`.`order_id` 
FROM `refnumbers` 
JOIN `deals` ON (`deals`.`ID` = `refnumbers`.`deal_id`) 
LEFT JOIN orders_chosenoptions ON (orders_chosenoptions.order_id = refnumbers.order_id)

看起来它的工作原理,但会遗漏一些行吗?我做错了吗?

1 个答案:

答案 0 :(得分:2)

据我所知(没有表定义),您正在处理4个表。要在一个查询中实现所需,您必须加入所有表并使用MySQL的orders_chosenoptions.product_id测试IF()以有条件地选择deals_products.pricedeals.price

SELECT r.refno, IF(cp.product_id > 0, dp.price, d.price) AS price, r.order_id 

FROM refnumbers r 

JOIN deals d ON d.ID = r.deal_id

LEFT JOIN orders_chosenoptions oc ON r.order_id = oc.order_id

LEFT JOIN deals_product dp ON oc.product_id = dp.id

WHERE r.deal_id = ...