MySQL: как сделать условное обновление? - PullRequest
1 голос
/ 05 апреля 2010

Я пытаюсь создать оператор обновления в следующих строках:

TABLE car: id | owner_id | type | status

У владельца может быть несколько машин.

UPDATE car c 
   SET c.type = 1 
     WHERE c.owner_id IN ($ids) 
     AND c.status = [1 IF THIS OWNER HAS A CAR WITH 1, ELSE A CAR WITH 0] // ... ???

$ ids достаточно мало (до 50 значений).

Это кажется простым, но я не могу обойти это, потому что я не могу использовать подзапрос SELECT с UPDATE для той же таблицы.

Любой

Спасибо

1 Ответ

2 голосов
/ 05 апреля 2010

Вы говорите, что пытались выполнить запрос, который не удался, но, к сожалению, вы не опубликовали его, поэтому я предполагаю, что он такой:

UPDATE car c 
SET c.type = 1 
WHERE c.owner_id IN ($ids) 
  AND c.status = (SELECT MAX(c2.status) FROM car c2 WHERE c.owner_id = c2.owner_id)

Было бы полезно опубликовать ваш фактический запрос, но сейчас я просто собираюсь предположить, что это то, что вы пытались. Если у вас есть что-то немного другое, это не имеет значения ... принцип тот же. Сбой, как вы правильно указали, потому что вы не можете обновить и выбрать одну и ту же таблицу в одном запросе. Один из способов обойти эту ошибку - заключить выбор в другой выбор:

UPDATE car c 
SET c.type = 1 
WHERE c.owner_id IN ($ids) 
  AND c.status = (SELECT * FROM
                    (SELECT MAX(c2.status) FROM car c2 WHERE c.owner_id = c2.owner_id)
                  AS T1)

Удивительно, но это сработает, даже если кажется, что оно должно быть эквивалентно первому запросу. Обратите внимание, что причина, по которой исходный запрос не работает, заключается в том, что он неправильно блокирует таблицу. Этот обходной путь заставляет MySQL разрешить запрос в любом случае, но вы должны знать, что его использование в многопользовательской среде может быть небезопасным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...