2012-08-30 16 views
5

Ich versuche Waise Beiträge in meiner Datenbank zu löschen und ich diese Abfrage erstellt haben:DELETE mit LIMIT in MySQL LEFT JOIN

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

Das Problem ist, dass ich begrenzen wollen, weil mein Tisch über 7.000.000 hat Aufzeichnungen.

Da ich LIMIT nicht mit der Abfrage verwenden kann, habe ich das versucht und tatsächlich funktioniert, aber ich bin mir nicht sicher, ob es eine effiziente Lösung ist oder ob es besser gemacht werden könnte.

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 

Wie kann ich das effizienter machen?

Danke!

+0

Warum können Sie 'LIMIT' nicht verwenden? – Kermit

+1

@njk "Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version für die richtige Syntax in der Nähe von 'LIMIT 1' in Zeile 5 entspricht" Offenbar kann LIMIT nicht mit LINKEN JOIN – Santiago

Antwort

8

Sie können LIMIT nicht direkt innerhalb DELETE verwenden, wenn Sie mehrere Tabellen zur gleichen Zeit sind Referenzierung, aber Sie können um das zu bekommen, was Sie durch Umhüllen in einem subselect löschen möchten:

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 ' Tut mir leid, was wäre "p.id"? Ich bin ziemlich neu in MySQL – Santiago

+0

@Santiago, das ist nur der Primärschlüssel der 'post' Tabelle. Ich sehe jetzt, dass es "postid" anstelle von "id" ist und meine Lösung jetzt anpasst. –

+0

@ zane-bien Sie können 'LIMIT' direkt verwenden, nur nicht in Multi-Tabellen-Syntax. – Kermit

0

Etwas so vielleicht?

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) 

können Sie MAX(postid) mit MIN() ersetzen und die Grenze, um es hinzuzufügen.