在MySQL中使用LEFT JOIN和LIMIT删除数据

18

我正在尝试删除数据库中的孤立帖子,我创建了这个查询:

DELETE post.*
      FROM foro_post AS post
      LEFT JOIN foro_thread AS thread USING(threadid)
      WHERE thread.threadid IS NULL

问题是我想限制查询结果,因为我的表格有超过700万条记录。

由于我无法在查询中使用LIMIT,所以我尝试了以下方法,它确实起作用了,但我不确定这是否是一种高效的解决方案,或者是否可以有更好的方法。

DELETE post.*
      FROM foro_post AS post
      LEFT JOIN foro_thread AS thread USING(threadid)
      WHERE thread.threadid IS NULL
      AND post.postid < 500

      // Where < 500 should be increasing as I delete records

有什么更高效的方法吗?


2
@njk "您的SQL语法存在错误,请检查与您的MySQL服务器版本相对应的手册,以获取正确使用语法。位于第5行附近的LIMIT无法使用左连接" 显然不能在LEFT JOIN中使用LIMIT。 - Santiago
在类似的情况下,您应该考虑使用带有某些约束条件的外键。 - Dávid Horváth
1个回答

32

当您同时引用多个表时,无法直接在DELETE中使用LIMIT,但是可以通过将想要删除的内容封装在子选择语句中来解决此问题:

DELETE po 
FROM   foro_post po
JOIN   (
       SELECT    p.postid
       FROM      foro_post p
       LEFT JOIN foro_thread t ON p.threadid = t.threadid
       WHERE     t.threadid IS NULL
       ORDER BY  p.postid
       LIMIT     50
       ) pp ON po.postid = pp.postid

对不起,"p.id" 是什么意思?我对 MySQL 还比较新。 - Santiago
@Santiago,那只是“post”表的主键。我现在看到它是postid而不是id,正在调整我的解决方案。 - Zane Bien
@Santiago 这很奇怪,不应该发生这种情况。也许表别名 p 与子查询中的别名冲突了(通常不应该出现这种情况)。请使用我最新的编辑尝试一下。 - Zane Bien
我尝试了你的最新修改,但仍然遇到相同的错误。也许这与我想要首先使用SELECT而不是DELETE进行测试有关?这是我的操作:SELECT po FROM foro_post po JOIN ( SELECT p.postid FROM foro_post p LEFT JOIN foro_thread t ON p.threadid = t.threadid WHERE t.threadid IS NULL ORDER BY p.postid LIMIT 50 ) pp ON po.postid = pp.postid - Santiago
@Santiago,你不应该使用*(这只是为了“与Access兼容”),但还是尝试使用po.* - Zane Bien
显示剩余4条评论

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