Условный оператор обновления SQL для двух таблиц одновременно - PullRequest
4 голосов
/ 15 июня 2011

Я хочу обновить две таблицы одновременно. Код ниже, кажется, работает нормально. Однако в некоторых случаях в 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

Ответы [ 3 ]

2 голосов
/ 15 июня 2011

Вам нужно сделать 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.Используйте те же самые предложения join и where для select вместо update, и вы увидите разницу:

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

против:

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)
2 голосов
/ 15 июня 2011

Попробуйте 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 голос
/ 15 июня 2011

просто установите его текущее значение, если вы не хотите изменять. И 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 просто отлично

...