2013-03-30 4 views
5

Я пытаюсь обновить последнюю запись, где имя John (John имеет несколько записей, но отличается ID), но я, кажется, привязан. Что случилось с моим запросом?Mysql: обновить поле самой последней записи

UPDATE messages_tbl SET is_unread=1 
WHERE ReceiveTime = (SELECT MAX(ReceiveTime) FROM messages_tbl WHERE name='John') 

Есть ли лучший способ сделать что-то подобное?

ответ

4

Вы можете присоединиться к обоим и выполнить обновление в зависимости от состояния.

UPDATE messages a 
     INNER JOIN 
     (
      SELECT name , MAX(ReceiveTime) max_time 
      FROM messages 
      GROUP BY name 
     ) b ON a.name = b.name AND 
       a.ReceiveTime = b.max_time 
SET  a.is_unread = 1 
-- WHERE a.name = 'John' 

Без WHERE состояние. Он обновит столбец is_unread для последней записи.

+0

Извините, я получаю код ошибки: 1064. – enchance

+0

Каково полное сообщение об ошибке? –

+0

'Запрос: обновление сообщений s1 set is_unread = 1 внутреннее соединение (SELECT Name, MAX (ReceiveTime) max_time FROM группа сообщений от Messa ... Код ошибки: 1064 У вас есть ошибка в синтаксисе SQL, проверьте руководство, соответствующее к вашей версии сервера MySQL для правильного синтаксиса для использования рядом с «внутренним соединением» (SELECT Name, MAX (ReceiveTime) max_time FROM группа сообщений »по строке 2' – enchance

22

Вы можете использовать ORDER и LIMIT.

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

UPDATE messages_tbl SET is_unread = 1 
WHERE name = 'John' 
ORDER BY ReceiveTime DESC 
LIMIT 1 

Этот запрос будет обновлять строки в порядке из самых высоких (самая последняя) ReceiveTime до самой низкой (самой старой) ReceiveTime. Используется вместе с LIMIT, только последние ReceiveTime будут изменены.

+0

Извините, я обновил свое объяснение. Не твоя вина. – enchance

+0

@enchance - Не проблема, просто хотел убедиться, что мой ответ по-прежнему имеет отношение к вашему вопросу :). – Aiias

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