删除50个最新行以外的所有行

时间:2008-09-28 19:22:01

标签: mysql sql

我有一个包含新闻故事和Unix时间戳的SQL表。我只想保留50个最新的故事。如何编写SQL语句来删除任何数量的旧故事?

7 个答案:

答案 0 :(得分:8)

块引用

delete from table where id not in (
    select id from table 
    order by id desc 
    limit 50
)

您选择了您不想删除的数据的ID,并删除了所有不在这些值中的数据......

答案 1 :(得分:6)

我最终使用了两个查询,因为MySQL在子查询中还不支持LIMIT

SELECT unixTime FROM entries ORDER BY unixTime DESC LIMIT 49, 1;
DELETE FROM entries WHERE unixTime < $sqlResult;

答案 2 :(得分:3)

嗯,看起来你不能在一个查询中做到这一点 - 如果我错了,有人会纠正我。我能够做到这一点的唯一方法是首先弄清楚表中的行数。例如:

select count(*) from table;

然后使用结果做

delete from table order by timestamp limit result - 50;

你必须这样做有两个原因 -

  1. MySQL 5不支持删除子查询中的限制
  2. MySQL 5不允许您从要删除的同一个表中选择子查询。

答案 3 :(得分:2)

如果您有很多行,最好将50行放在临时表中 然后使用 TRUNCATE TABLE 清空表格。然后把50行放回去。

答案 4 :(得分:0)

我就是这样做的:

DELETE FROM `table` WHERE `datetime` < (SELECT `datetime` FROM `table` ORDER BY `datetime` DESC LIMIT 49,1);

其中table是表,datetime是日期时间字段。

答案 5 :(得分:-1)

假设此查询选择了您要保留的行:

SELECT timestampcol FROM table ORDER BY timestampcol DESC LIMIT 49,1;

然后你可以像这样使用子查询:

DELETE FROM table WHERE timestampcol < ( SELECT timestampcol FROM table ORDER BY timestampcol DSEC LIMIT 49,1 )

当然,在做任何可能具有破坏性的事情之前,请确保您有备份。请注意,与使用IN的其他方法相比,这个方法将避免对要删除的每一行进行50次整数比较,使其(可能)快50倍 - 假设我的SQL正确。

答案 6 :(得分:-2)

也许不是最有效的,但这应该有效:

DELETE FROM _table_ 
WHERE _date_ NOT IN (SELECT _date_ FROM _table_ ORDER BY _date_ DESC LIMIT 50)