将两个mysql请求(SELECT和UPDATE)合并为一个

时间:2015-10-14 21:27:10

标签: php mysql

我有两个mysql表:

  • 一个名为rawmats的表格,用于存储一些原材料的数量;
  • 另一个名为stock_changes的存储事件,当某种材料的库存发生变化时(存储增量数量,与材料ID绑定)。

我需要发出一个mysql请求,以便将stock_changes表中存储的所有更改撤消到rawmats中存储的实际库存。

目前,以下php代码做得很好:

$stock_changes_req = $db->prepare('SELECT rawmat_id, delta FROM stock_changes');
$stock_update_req = $db->prepare('UPDATE rawmats SET stock = stock - :delta WHERE id=:rawmat_id');

$stock_changes_req->execute();
$stock_changes = $stock_changes_req->fetchAll(PDO::FETCH_ASSOC);

foreach ($stock_changes as $stock_change)
    $stock_update_req->execute($stock_change);

有两个问题:

  • 是否可以将这两个请求(以及php循环)合并为一个大的mysql请求?我想如果以这种方式编码可能会更好
  • 如果合并是可能的,那么它在性能方面是否有益?我个人认为是这样,因为它会替换两个mysql请求和一个php循环,只有一个大的mysql请求。如果性能提升很小,那么我的问题对我没有兴趣。

1 个答案:

答案 0 :(得分:1)

是的,在一个查询中合并select和update是个好主意,特别是当它避免了更慢的php循环时。请考虑以下解决方案草案:

UPDATE table1 t1, table2 t1 SET t1.stock = t1.stock - t2.delta WHERE t1.id=t2.id and ...

您还可以使用快速临时内存表(包含来自任何SELECT的半结果)或子查询而不是 table2