我有一个在我的PHP网站上每小时运行的脚本。在这个脚本中,我想使用某种MySQL查询来删除一张表中除最新的50条记录外的所有记录。
我该如何做到这样?
// pseudo code: like this?
DELETE from chat WHERE id = max (ID - 50)
我有一个在我的PHP网站上每小时运行的脚本。在这个脚本中,我想使用某种MySQL查询来删除一张表中除最新的50条记录外的所有记录。
我该如何做到这样?
// pseudo code: like this?
DELETE from chat WHERE id = max (ID - 50)
你可以尝试使用 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
较高的值总是较新的。
date
字段,如果有帮助的话。 - user1022585#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
- user1022585NOT 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));
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
DELETE FROM chat WHERE ID NOT IN(SELECT TOP 50 ID FROM chat ORDER BY ID DESC)
- pistipankoDELETE FROM chat WHERE datecol NOT IN(SELECT TOP 50 datecol FROM chat ORDER BY datecol DESC)-- SQL Server
DELETE FROM chat WHERE datecol NOT IN(SELECT datecol FROM chat ORDER BY datecol DESC LIMIT 50) --MySQL
- pistipanko#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
- user1022585