MySQL按顺序删除

21

我有一张表格,按ID排序并仅显示最新的30行。

我尝试使用下面的查询语句删除30个最新行后的任何行。

DELETE FROM table WHERE type = 'test' ORDER BY id DESC LIMIT 30, 60

我一直收到以下错误

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' 60' at line 1

我做错了什么?

5个回答

31

试试这个

DELETE FROM table
WHERE ID IN
        (
        SELECT ID
        FROM
            (
                SELECT ID
                FROM table
                WHERE Type = 'TEST'
                ORDER BY ID
                LIMIT 30,60
            ) a
        )

2
请注意,a 用作子查询的别名:https://dev59.com/nmUq5IYBdhLWcg3wHs6Y#14767216。谢谢。这对我帮助很大! - Derek
3
需要进行双重嵌套以隐式创建一个临时表来解决问题。请参见此答案的说明 - user2609094
如果您已经与另一个表连接,请查看此链接 - https://dev59.com/ymct5IYBdhLWcg3wSbjY#12202674 - Adarsh Madrecha

8
< p > 第二次编辑: 虽然MySQL支持在删除语句中使用LIMIT,但不允许使用OFFSET。这意味着您不能跳过前30行。

对id(或任何其他主键)进行子选择:

DELETE FROM table WHERE id IN (SELECT id FROM table WHERE type = 'test' ORDER BY id DESC LIMIT 30, 60)

2
我得到了 #1235 - 这个版本的MySQL还不支持'LIMIT & IN/ALL/ANY/SOME子查询'。 - Abby E
实际上,你可能会惊讶地发现它实际上支持*DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]*。但是,它不支持多表删除语句。 - Fluffeh
2
@alexn,不想挑毛病,但这样做不会删除前30行吗?而这正是OP想要保留的。他想要删除您的查询将要删除的那30行之后的30行。 - Fluffeh
@Fluffeh 是的,你说得对。你能提供一种使用指定偏移量和行数的LIMIT的解决方案吗?我不确定它是否被支持。 - alexn
2
@alexn 不,它简单地不支持偏移量。唯一的方法是使用John Woo给出的查询(带有双子查询)。 - Fluffeh
显示剩余2条评论

0

我无法在子查询中使用limit子句,所以我使用的解决方案有些混乱:

select group_concat(id) into @idList from
( 
select id from  table order by id desc limit 0,30
) as saveIds;
delete from table where not find_in_set(id,@idList)

或者,

select group_concat(id) into @idList from
( 
select id from  table order by id desc limit 30
) as saveIds;
delete from table where find_in_set(id,@idList)

0

这种方式是不可能的。 你可以尝试使用嵌套的选择语句,类似于这样:

DELETE FROM table
WHERE type = 'test'
AND ID IN (SELECT id from table where type = 'test' order by id desc limit 30 )

0
尝试像这样

DELETE FROM table WHERE id in(SELECT id FROM table WHERE type = "test" order by id desc limit 30, 60)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接