[英]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, bidGroups
與inner join
watchedItems, bidGroups
相同,因此當bidGroups
中bidGroups
要加入的條目時,您也無法從watchedItems
獲得結果。 在select
而不是update
上使用相同的join
和where
子句,您將看到差異:
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.