【问题标题】:DELETE FROM for entries with same id, but leave the last one in the table删除具有相同 id 的条目,但将最后一个保留在表中
【发布时间】:2011-10-21 15:11:18
【问题描述】:

我有一个表格,其中包含

id  username    password    last_touch

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

某处类似于:

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

(显然上面例子中的语法不正确,所以 MySQL 会报错。)

【问题讨论】:

  • 这取决于 id 的声明,是自动递增(应该是)还是您自己为 id 添加值?如果它是自动递增的,我认为您不能拥有多个具有相同 ID 的整体。

标签: mysql sql sql-delete


【解决方案1】:

使用嵌套查询选择给定用户 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
    )

更新:修复了对内部 SELECT 中修改的表的直接引用,方法是根据 Frank 的 cmets 将另一个 SELECT 包裹在其周围。

【讨论】:

  • 嗯.. 试过了,但我得到“#1093 - You can't specify target table 'users' for update in FROM 子句”
  • 我认为这是问题所在:stackoverflow.com/questions/45494/…
  • @FrankVilea:确实,我忘记了这个限制。使用有效的查询更新了答案。
【解决方案2】:
DELETE FROM user_data u
WHERE id=1 
AND last_touch < (SELECT max(last_touch)
                  FROM user_data 
                  WHERE id=u.id)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 2012-11-05
    相关资源
    最近更新 更多