2013-03-30 143 views
5

我试图更新名称为JohnJohn有多个记录但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 messages group by Messa ... 错误代码:1064 您的SQL语法错误;请检查对应的手册到您的MySQL服务器版本的正确的语法使用附近的'内部连接(SELECT名称,MAX(ReceiveTime)max_time FROM消息组'在第2行' – enchance

22

您可以尝试使用ORDERLIMIT

试试这个:

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