PHP - MySQL - 删除除最近3行之外的所有行&此版本的MySQL尚不支持'LIMIT&IN/ALL/ANY/SOME子查询'

Sha*_*bot 2 php mysql

我有:

mysql_query("DELETE FROM mytable ORDER BY id DESC LIMIT 3, 999999999;") 
or die(mysql_error());
Run Code Online (Sandbox Code Playgroud)

但似乎并不喜欢它.我想保留最近的三行并删除其他所有内容.思考?

跟进 - 感谢同时的jinx!

我尝试了代码,并得到此版本错误:

This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
Run Code Online (Sandbox Code Playgroud)

我检查了我的主机,我有:MySQL版本5.5.36-cll-lve

我没想到这一点.限制需要什么版本?有没有其他方法可以写出这个有效的方法?

Mik*_*sen 9

你认为你的第一次尝试确实有效.但是,LIMITMySql DELETE命令中的关键字仅支持最大行数,而不支持要删除的值范围.这就是您看到错误的原因.接下来,你会认为(正如我所想)这样的东西会起作用:

DELETE FROM mytable WHERE id NOT IN
   (SELECT id FROM mytable ORDER BY id DESC LIMIT 3);
Run Code Online (Sandbox Code Playgroud)

但是,MySql似乎也不支持语句INNOT IN运算符DELETE.接下来,您会认为这样的事情会起作用:

DELETE FROM mytable WHERE id <
   (SELECT id FROM mytable ORDER BY id DESC LIMIT 2,1)
Run Code Online (Sandbox Code Playgroud)

但是,似乎MySql也不支持这个想法.还有一些帖子说你需要建立一个临时表,这看起来非常愚蠢!然而,与一群嵌套的选择和别名两轮牛车的,我能够得到这样的工作:

DELETE FROM mytable WHERE id <
  (select id FROM (SELECT * FROM myTable) as t ORDER BY id DESC LIMIT 2,1);
Run Code Online (Sandbox Code Playgroud)

工作小提琴

令人难以置信的MySql让这很难!也许是时候建立一个更好的数据库了,比如PostgreSQL?它会像你期望的那样工作.


Mar*_*ker 7

DELETE FROM mytable WHERE id < ( 
    SELECT id FROM mytable ORDER BY id DESC LIMIT 2,1 
)
Run Code Online (Sandbox Code Playgroud)

如果您的MySQL版本在delete语句中抱怨子查询,请尝试

DELETE FROM mytable WHERE id < ( 
    SELECT id FROM ( 
        SELECT id FROM mytable ORDER BY id DESC LIMIT 2,1 
    ) 
)
Run Code Online (Sandbox Code Playgroud)


S.V*_*ser 5

过滤前3个ID并删除其余ID,您可以使用此查询执行此操作:

 DELETE FROM mytable WHERE id NOT IN ( 
  SELECT id FROM mytable ORDER BY id DESC LIMIT 3 
 )
Run Code Online (Sandbox Code Playgroud)