2015-10-14 84 views
0

我有两个MySQL表:合并两个MySQL的请求(SELECT和UPDATE)为一个

  • 的表中调用rawmats存储部分原料的数量;
  • 另一个称为stock_changes的存储事件,当某种物料的库存正在变化时(增量数量被存储,与物料ID绑定)。

我需要以撤消存储在stock_changes表,存储在rawmats的实际库存的所有更改的MySQL的请求。

目前,下面的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

是的,合并选择和更新在一个查询是一个好主意,尤其是当它避免慢得多的PHP循环。请考虑以下解决方案的草案:

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

您还可以使用快速临时存储表(用半结果从任何SELECT)或子查询,而不是表2

+0

SQL是这样对我:很难找到正确的方法,但如此明显,当你可以看到解决方案......顺便说一下,你拼错了table2别名(t1而不是t2)。许多thx – yolenoyer