DELETE FROM for entries with same id, but leave the last one in the table

不打扰是莪最后的温柔 提交于 2019-12-12 01:51:56

问题


I have a table that contains

id  username    password    last_touch

It is possible to have duplicate entries for the same id. The last_touch is the timestamp of the last insert command. How can I delete all entries with the same id, apart from the last one that is left so I always have the user details which are most up to date?

Somewhere along the lines of:

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

(Obviously the syntax is not correct in the above example, so MySQL complains.)


回答1:


Use a nested query to select the latest timestamp for the given user id, and delete all rows for that id with timestamps different than that one:

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
    )

Update: Fixed direct reference to table being modified in inner SELECT by wrapping another SELECT around it, as per Frank's comments.




回答2:


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


来源:https://stackoverflow.com/questions/7851467/delete-from-for-entries-with-same-id-but-leave-the-last-one-in-the-table

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!