2011-06-15 144 views
4

我想一次更新两个表。下面的代码似乎工作正常。但是,在某些情况下,bidGroups中没有条目,这意味着整个语句会失败。我如何调整,以便它更新的第一位(watchedItems)并不会尝试第二部分,如果watchedItems.bidGroupID IS NULL同时为两个表创建条件SQL更新语句

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 

回答

2

尝试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; 

......

+1

就是这样。完美的作品。非常感谢Abhay。现在我了解JOIN的时间了:-) – 2011-06-15 19:03:37

1

只要将其设置为当前值,如果您不想更改。 当数值相同时,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就好了

+0

我喜欢这个主意。但是,当我尝试它并且在bidGroups表中没有条目时,它也不会影响watchedItems表? :-( – 2011-06-15 18:49:23

+0

','和'inner join'是一样的,这就是为什么。我在我的答案中加了一些解释。 – 2011-06-15 18:56:00

+0

用'left join'更新答案 – 2011-06-15 19:02:07

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,所以当没有在bidGroups一个条目加入到,你还没有得到来自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) 
+0

我认为这是行不通的,因为如果'bidGroups'没有ID = 2的条目,那么WHERE子句中的条件“bg.id = 2”将不会产生结果;没有结果将意味着没有更新将运行 – Abhay 2011-06-15 19:01:50

+0

Abhay是正确的。我尝试了所有这些,不幸的是他们被接受语法明智,但没有返回结果..非常感谢您的努力和解释,虽然,高度赞赏! – 2011-06-15 19:02:58

+0

好点。只需要用'OR'来检查null,以便处理右侧没有结果的情况。但是,Abhay将这种条件放在“ON”条款中的方式更加清晰。 – 2011-06-15 19:57:14