Подтвердить что ты не робот

Обновление нескольких строк с несколькими значениями и несколькими условиями mysql

Я столкнулся с сложной ситуацией SQL-запросов. Задача состоит в том, чтобы обновить несколько строк, с несколькими значениями и несколькими условиями. Ниже приведены данные, которые я хочу обновить; Поле для обновления: 'sales', поля условий: 'campid' и 'date':

if campid = 259 and date = 22/6/2011 then set sales = $200
else if campid = 259 and date = 21/6/2011 then set sales = $210
else if campid = 260 and date = 22/6/2011 then set sales = $140
else if campid = 260 and date = 21/6/2011 then set sales = $150

Я хочу обновить все это в одном запросе.

4b9b3361

Ответ 1

Попробуйте следующее:

UPDATE your_table SET sales = 
CASE 
    WHEN campid = 259 AND date = 22/6/2011 THEN 200
    WHEN campid = 259 AND date = 21/6/2011 THEN 210
    WHEN campid = 259 AND date = 22/6/2011 THEN 140
    WHEN campid = 259 AND date = 21/6/2011 THEN 150
    ELSE sales
END

Естественно, я не знаю, действительно ли поле даты DATE или DATETIME, поэтому я оставил запрос, показывающий, что вы можете сделать, но, возможно, вам нужно установить сравнение дат в соответствии с типом данных. Если поле даты - DATE (как следует), вы можете написать AND date = '2011-06-22' и т.д.
Примечание ELSE условие: необходимо избегать записей, не попадающих в другие случаи, будет установлено значение NULL.

Ответ 2

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

Вы не говорите, какую версию MySQL вы используете, а не какой механизм хранения. Предполагая, что InnoDB - это стандарт в последних версиях MySQL и обычно должен использоваться для транзакционных систем, а также если вы делаете это из клиента командной строки, вы бы

mysql> set autocommit=0;
mysql> UPDATE ....;
mysql> UPDATE ....;
mysql> ...
mysql> commit;

Затем вы можете повторно активировать автокоманду, если хотите, повторив первую строку, но со значением 1:

mysql> set autocommit=1;

Ответ 3

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