MySQL:更新最新记录的字段

25

我正在尝试更新名字为John的最新记录(John有多条记录但ID不同),但似乎遇到了困境。我的查询有什么问题?

我试图更新名称为John的最新记录,但是我似乎陷入了困境。我的查询有什么问题?

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

有没有更好的方法来做类似这样的事情?

2个回答

73

你可以尝试使用 ORDERLIMIT

试试这个:

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

此查询将按照最高(最近)的ReceiveTime顺序更新行,直到最低(最旧)的ReceiveTime。与LIMIT一起使用,只有最近的ReceiveTime会被更改。


@enchance - 没问题,只是想确保我的回答仍然与你的问题相关 :)。 - Aiias

8

您可以将两个表联结起来,并根据条件执行更新操作。

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 列。

抱歉,我遇到了“错误代码:1064”。 - enchance
Query : update messages s1 set is_unread=1 inner join (SELECT Name, MAX(ReceiveTime) max_time FROM messages group by Messa... Error Code : 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'inner join (SELECT Name, MAX(ReceiveTime) max_time FROM messages group' at line 2 - enchance
太棒了!您介意解释一下为什么另一个方法不起作用吗?我取消注释了 WHERE,这样我就可以针对特定的行进行操作,它仍然有效。 :) - enchance
@enchance 哪一个? - John Woo
你修改前的第一份代码,然后才有了现在这个。 - enchance
哦,这真的是一个语法错误,因为SET语句在INNER JOIN关键字之前。 - John Woo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接