2012-08-30 123 views
5

我想刪除我的數據庫孤兒的帖子,我創造了這個查詢:DELETE使用LEFT與LIMIT JOIN在MySQL

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 

我該如何更有效地做到這一點?

謝謝!

+0

爲什麼不能使用LIMIT? – Kermit

+1

@njk「你的SQL語法有錯誤;檢查與你的MySQL服務器版本對應的手冊,在第5行的'LIMIT 1'附近使用正確的語法。」顯然不能使用LIMIT和LEFT JOIN – Santiago

回答

8

當你同時引用多個表中你不能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 
+0

I'對不起,什麼是「p.id」?我對MySQL – Santiago

+0

@Santiago相當陌生,這只是'post'表的主鍵。我現在看到它是'postid'而不是'id',現在調整我的解決方案。 –

+0

@ zane-bien您可以直接使用'LIMIT',而不是使用多表語法。 – Kermit

0

東西也許這樣?

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

您可以替換MAX(postid)MIN()和限制添加到它。