2012-08-30 49 views
5

Tôi đang cố gắng để xóa bài viết đứa trẻ mồ côi tại cơ sở dữ liệu của tôi và tôi đã tạo ra truy vấn này:DELETE sử dụng LEFT JOIN với LIMIT trong MySQL

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

Vấn đề là tôi muốn giới hạn vì bàn của tôi có hơn 7.000.000 Hồ sơ.

Vì tôi không thể sử dụng LIMIT với truy vấn, tôi đã thử điều này và thực sự đã làm việc, nhưng tôi không chắc đó có phải là giải pháp hiệu quả hay không.

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 

Làm cách nào để làm điều này hiệu quả hơn?

Cảm ơn!

+0

Tại sao bạn không thể sử dụng 'LIMIT'? – Kermit

+1

@njk "Bạn có lỗi trong cú pháp SQL của bạn; hãy kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để biết cú pháp đúng để sử dụng gần 'LIMIT 1' ở dòng 5" Rõ ràng không thể sử dụng LIMIT với LEFT JOIN – Santiago

Trả lời

8

Bạn không thể sử dụng trực tiếp trong LIMITDELETE khi bạn đang tham khảo nhiều bảng cùng một lúc, nhưng bạn có thể khắc phục điều đó bằng cách bọc những gì bạn muốn xóa trong vòng một subselect:

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 ' m xin lỗi, những gì sẽ là "p.id"? Tôi khá mới với MySQL – Santiago

+0

@Santiago, đó chỉ là khóa chính của bảng 'bài'. Bây giờ tôi thấy rằng nó 'postid' thay vì 'id', điều chỉnh giải pháp của tôi bây giờ. –

+0

@ zane-bien Bạn có thể sử dụng 'LIMIT' trực tiếp, không phải trong cú pháp nhiều bảng. – Kermit

0

Something như thế này có lẽ?

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) 

Bạn có thể thay thế MAX(postid) bằng MIN() và thêm giới hạn vào nó.