对于具有相同ID的条目,请删除FROM,但将最后一个保留在表中

时间:2011-10-21 15:11:18

标签: mysql sql sql-delete

我有一个包含

的表格
id  username    password    last_touch

可能有相同ID的重复条目。 last_touch是最后一个insert命令的时间戳。如何删除所有具有相同ID的条目,除了最后一个条目,所以我总是拥有最新的用户详细信息?

某些地方:

DELETE FROM user_data 
WHERE id=1 
LIMIT (count(SELECT 1 
             FROM user_data 
             WHERE id=1) - 1)

(显然在上面的例子中语法不正确,所以MySQL抱怨。)

2 个答案:

答案 0 :(得分:4)

使用嵌套查询为给定的用户ID选择最新的时间戳,并删除该ID的所有行,其时间戳不同于该时间戳:

DELETE FROM user_data
WHERE ID = 1 AND last_touch != 
    (SELECT latest FROM
        (SELECT MAX(last_touch) AS latest FROM user_data WHERE ID = 1) AS temp
    )

更新:根据Frank的评论,修正了对内部SELECT中正在修改的表的直接引用,并在其周围包含另一个SELECT

答案 1 :(得分:2)

DELETE FROM user_data u
WHERE id=1 
AND last_touch < (SELECT max(last_touch)
                  FROM user_data 
                  WHERE id=u.id)