2015-08-23 4 views
2

Я пытаюсь обновить несколько столбцов в случае, если одно новое значение меньше, чем старый:MySQL: Обновление нескольких столбцов в IF заявлении

INSERT INTO `toptimes`.`$enc` (serial,name,time,date,tag) VALUES ('$serial','$name','$time','$date','$tag') ON DUPLICATE KEY UPDATE IF(`time` > '$time',(`time` = '$time',`name`='$name')); 

Здесь возникает проблема, мне нужно сделать это так :

ON DUPLICATE KEY UPDATE IF(`time` > '$time',(`time` = '$time',`name`='$name')); 

Таким образом, если новое значение $time ниже старого time, обновить 2 колонки: обновление time, а также обновить name столбец, но если случай не соответствует, не обновлять ничего. Как я могу заставить его работать?

Спасибо.

ответ

2

Вы можете использовать выражения case в on duplicate key part. Вы просто должны повторить логику:

INSERT INTO `toptimes`.`$enc` (serial, name, time, date, tag) 
    VALUES ('$serial', '$name', '$time', '$date', '$tag') 
    ON DUPLICATE KEY UPDATE 
     time = least(time, values(time)), 
     name = (case when values(time) < time then values(name) else name end); 
+0

Проблема заключается в том, что выбирает наибольшее значение, когда он должен выбрать наименьшую один, и имя по-прежнему не обновляется, так как я его переделал: INSERT INTO 'toptimes'.' $ enc' (серийный номер, имя, время, дата, тег) VALUES ('$ serial', '$ name', '$ time', ' $ date ',' $ tag ') ON DUPLICATE KEY UPDATE time = LEAST (' $ time ', 'time'), name = (CASE КОГДА время Gallardo994

+1

@ Gallardo994. , , 'VALUES (time)' - значение * new * времени, которое будет вставлено, что эквивалентно '$ time' в вашем случае. 'VALUES()' имеет несколько преимуществ, в том числе вы можете вставлять сразу несколько строк одновременно. –

+0

Есть ли другой способ формулировки SQL-операторов, чтобы избежать повторения логики? – ahnbizcad

0

Fixed, переместив time обновление до конца:

INSERT INTO `toptimes`.`$enc` (serial,name,time,date,tag) VALUES ('$serial','$name','$time','$date','$tag') ON DUPLICATE KEY UPDATE name = (CASE WHEN '$time' < `time` THEN '$name' ELSE `name` END), time = LEAST('$time',`time`); 
Смежные вопросы