23

John名前が(複数のレコードがありますがIDが異なる)最新のレコードを更新しようとしてJohnいますが、バインドされているようです。クエリの何が問題になっていますか?

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

このようなことを行うより良い方法はありますか?

4

2 に答える 2

67

と を使用してみてORDERくださいLIMIT

これを試して:

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

このクエリは、最高 (最新)ReceiveTimeから最低 (最も古い) の順に行を更新しますReceiveTime。と組み合わせて使用​​すると、LIMIT最新のものだけReceiveTimeが変更されます。

于 2013-03-30T07:02:10.537 に答える
7

両方を結合して、条件に基づいて更新を実行できます。

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'

条件なしWHEREis_unreadこれにより、最新のエントリの列がすべて更新されます。

于 2013-03-30T07:02:39.460 に答える