[英]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.