问题
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