我有一个包含新闻故事和Unix时间戳的SQL表。我只想保留50个最新的故事。如何编写SQL语句来删除任何数量的旧故事?
答案 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;
你必须这样做有两个原因 -
答案 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)