2015-10-14 86 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