2013-09-02 2 views
2

Я попытался установить значение max для конкретного столбца, но это не работает для меня. Я не знаю, где я ошибаюсь.Обновление с максимальным значением столбца не работает в mysql

UPDATE `upload_video` 
      SET order_id ='select max(order_id)+1 
      FROM upload_video' 
      WHERE `video_id` = 22 

Это мой запрос я запустить select max(order_id)+1 from upload_video запрос отдельно, что дает результат. Но если я использую этот запрос в запросе обновления, запрос выполняется без ошибок. Но order_id не обновляется должным образом. помогите мне

+0

Для начала вы не можете писать «UPDATE» – cameronjonesweb

+0

user1672694 Я изменил это сейчас, но все же он не работает – Kalai

ответ

4

Ваш запрос почти правильно в стандартном SQL, вам нужно всего лишь использовать скобки () вместо апострофа ':

SET order_id = (SELECT MAX(...) ...) 

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

UPDATE 
    upload_video JOIN (SELECT COALESCE(MAX(order_id),0)+1 max_id 
        FROM upload_video) s 
SET 
    upload_video.order_id=s.max_id 
WHERE 
    video_id=22 

См. Скрипку here.

+0

Спасибо, что он отлично работает. – Kalai

+0

Не могли бы вы объяснить, что не так с моим запросом. – Kalai

+0

Большое спасибо за ваше объяснение – Kalai

4

У вас есть опечатка в инструкции, вы использовали UPADTE вместо UPDATE.

Одна из проблем заключается в том, чтобы не приводить подзапрос. Вы использовали одинарные кавычки, что означает выражение select max(order_id)+1... было интерпретировано как текстовый литерал (varchar). Но вы явно этого не хотите (я думаю, order_id - это число). Вместо этого вы должны оценить подзапрос. Однако, если вы попробуете:

UPDATE `upload_video` 
     SET order_id =(select max(order_id)+1 
     FROM upload_video) 
     WHERE `video_id` = 22 

затем MySQL не разрешает (я об этом не знал). Другие базы данных, такие как PostgreSQL, позволяют это. Поэтому вам могут потребоваться два отчета:

select @id = coalesce(max(order_id), 0) + 1 FROM upload_video; 
UPDATE `upload_video` SET order_id = @id WHERE `video_id` = 22; 

Обратите внимание, что это работает в MySQL, но не в других базах данных.

+2

В приведенном выше запросе отображается ошибка «# 1093 - Вы не можете указать целевую таблицу« upload_video »для обновления в FROM FROM " – Kalai

+0

Вы правы, я не знал об этом. Я обновил свой ответ. –

+0

Ответ от fthiella ('update ... join') явно более изящный, но я оставляю этот ответ здесь как альтернативное решение. –

1

Попробуйте это:

UPDATE `upload_video` 
SET order_id =(select COALESCE(max(U2.order_id),0)+1 
     FROM upload_video U2) 
WHERE `video_id` = 22 

Peraphs этот запрос идет по ошибке, потому что MySql не хочет использовать ту же таблицу в UPDATE и в подзапрос.

Если ваш случай, напишите два запроса.

Первый получить максимальное значение, то второе делает изменение

+0

Вы устанавливаете 'order_id' в строку. – Barmar

+0

@Barmar: удалена отметка о прозаклеивании –

+0

@Joe Taras В результате получается то же самое. Без изменений – Kalai

Смежные вопросы