【问题标题】:MySQL DELETE all but latest X recordsMySQL DELETE 除最新的 X 记录外的所有记录
【发布时间】:2012-01-16 20:44:40
【问题描述】:

我有一个每小时在我的 php 网站上运行的脚本。在那个脚本中,我想要某种 MySQL 查询来删除表中的每条记录,但说最新的 50 条。

我该怎么做呢?

// pseudo code: like this?
DELETE from chat WHERE id = max (ID - 50) 

【问题讨论】:

  • 可以在表格中添加时间戳字段吗?
  • 如果您的 ID 列是自增为 1 的标识列,您可以这样做:DELETE FROM chat WHERE ID NOT IN(SELECT TOP 50 ID FROM chat ORDER BY ID DESC)
  • 在这种情况下使用:DELETE FROM chat WHERE datecol NOT IN(SELECT TOP 50 datecol FROM chat ORDER BY datecol DESC)-- SQL ServerDELETE FROM chat WHERE datecol NOT IN(SELECT datecol FROM chat ORDER BY datecol DESC LIMIT 50) --MySQL
  • @user1022585 - 我认为您应该根据时间跨度(x 和 x 之间)而不是记录数来删除。是否有某些原因必须是最后 50 个,而不是时间段/跨度?
  • #1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

标签: mysql sql-delete records


【解决方案1】:

您可以尝试使用 NOT IN:

编辑 MySQL

DELETE FROM chat WHERE id NOT IN ( 
  SELECT id 
  FROM ( 
    SELECT id 
    FROM chat 
    ORDER BY id DESC 
    LIMIT 50
  ) x 
); 

这适用于 SQL-Server

DELETE FROM chat WHERE id NOT IN 
    (SELECT TOP 50 id FROM chat ORDER BY id DESC)  

假设id 的较高值总是较新。

【讨论】:

  • 最好按 DESCending 顺序排列这些 ID。
  • 试过这个它不起作用:/如果有帮助,我也有一个 date 字段
  • 哎呀。您的问题带有 SQL 标记 - 现在尝试使用 MySQL 解决方案。
  • #1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
  • 现在对其进行了编辑以避免子查询 LIMIT 问题 - 立即尝试,它可以工作。
【解决方案2】:

NOT IN 效率低下。您可以稍微修改@Mithrandir 上一个答案中的第一个选项,使其看起来像这样:

DELETE from chat WHERE id < 
  (SELECT id FROM 
    (SELECT id FROM chat ORDER BY id DESC LIMIT 50) t ORDER BY id ASC LIMIT 1));

【讨论】:

    【解决方案3】:

    你可以试试这样的:

    DELETE from chat WHERE id < (SELECT max(ID)-50 FROM chat) 
    

    如果您的 ID 值以 1 为增量递增,这将起作用。或者您可以使用类似的东西:

    DELETE FROM chat WHERE id NOT IN 
        (SELECT id FROM ( SELECT ID FROM chat ORDER BY datetime_col DESC LIMIT 50) t ) -- mysql
    

    【讨论】:

    • 你使用什么数据库系统?
    猜你喜欢
    • 2011-11-06
    • 2012-10-01
    • 2013-11-24
    • 2011-04-26
    • 2020-08-22
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    相关资源
    最近更新 更多