簡體   English   中英

一次兩個表的條​​件SQL更新語句

[英]A conditional SQL update statement for two tables at once

我想一次更新兩個表。 下面的代碼似乎工作正常。 但是,在某些情況下,bidGroups中沒有條目,這意味着整個語句將失敗。 如何調整它以便更新第一位(watchedItems)並且如果watchedItems.bidGroupID IS NULL則不嘗試第二部分

UPDATE watchedItems, bidGroups 
SET watchedItems.won=1, bidGroups.bidGroupQty=bidGroups.bidGroupQty-1 
WHERE watchedItems.id=2 
AND watchedItems.aid=200618152822 
AND bidGroups.bidGroupID=watchedItems.bidGroupID 
AND bidGroups.id=2;

我試過這個,但語法錯了..

UPDATE  watchedItems, bidGroups 
SET watchedItems.won=1, 
CASE WHEN watchedItems.bidGroupID IS NOT NULL THEN bidGroups.bidGroupQty=bidGroups.bidGroupQty-1 
ELSE END
WHERE watchedItems.id=2 
AND watchedItems.aid=200618152822 
AND bidGroups.bidGroupID=watchedItems.bidGroupID 
AND bidGroups.id=2

你需要做一個left outer join

update watchedItems wi left outer join bidGroups bg
 on wi.bidGroupID = bg.bidGroupID
 set
  wi.won = 1,
  bg.bidGroupQty = bg.bidGroupQty - 1
 where wi.id = 2
 and wi.aid = 200618152822
 and (bg.id = 2 or bg.id is null)

如果watchedItems.bidGroupId為空,那么它只會更新在發現的行watchedItems ,因為沒有什么可以加入到bidGroups 如果不是,並且連接在兩個表中都獲得了行,那么對兩個表的更新都會發生。

僅使用watchedItems, bidGroupsinner join watchedItems, bidGroups相同,因此當bidGroupsbidGroups要加入的條目時,您也無法從watchedItems獲得結果。 select而不是update上使用相同的joinwhere子句,您將看到差異:

select wi.won, bg.bidGroupQty
 from watchedItems wi, bidGroups bg
 where wi.id = 2 and wi.aid = 200618152822
 and (bg.id = 2 or bg.id is null)
 and wi.bidGroupID = bg.bidGroupID

VS:

select wi.won, bg.bidGroupQty
 from watchedItems wi left outer join bidGroups bg
 on wi.bidGroupID = bg.bidGroupID
 where wi.id = 2 and wi.aid = 200618152822
 and (bg.id = 2 or bg.id is null)

以這種方式嘗試LEFT JOIN:

UPDATE watchedItems 
LEFT JOIN bidGroups ON watchedItems.bidGroupID = bidGroups.bidGroupID AND bidGroups.id=2
SET watchedItems.won=1, bidGroups.bidGroupQty=bidGroups.bidGroupQty-1 
WHERE watchedItems.id=2 
AND watchedItems.aid=200618152822;

......

如果你不想改變,只需將其設置為當前值。 並且MySQL通常在值相同時不更新它來優化它。

UPDATE watchedItems 
  LEFT JOIN bidGroups ON bidGroups.bidGroupID=watchedItems.bidGroupID 
       AND bidGroups.id=2
SET watchedItems.won=1, 
    bidGroups.bidGroupQty= if(watchedItems.bidGroupID IS NULL, 
                              bidGroups.bidGroupQty, 
                              bidGroups.bidGroupQty-1)
WHERE watchedItems.id=2 
AND watchedItems.aid=200618152822;

但是,您不需要if因為如果watchedItems.bidGroupID IS NULL則不會加入bidGroups中的行,並忽略該不存在的行的更新。 所以bidGroups.bidGroupQty=bidGroups.bidGroupQty-1就好了

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM