遵循此内存限制问题:
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)
看起来它的工作原理,但会遗漏一些行吗?我做错了吗?
答案 0 :(得分:2)
据我所知(没有表定义),您正在处理4个表。要在一个查询中实现所需,您必须加入所有表并使用MySQL的orders_chosenoptions.product_id
测试IF()
以有条件地选择deals_products.price
或deals.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 = ...