2012-08-30 12 views
5

Sto cercando di cancellare i messaggi orfani nel mio database e ho creato questa query:eliminare utilizzando LEFT JOIN con LIMIT in MySQL

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

Il problema è che io voglio limitare a causa mia tavola ha più di 7.000.000 record.

Poiché non posso utilizzare LIMIT con la query, l'ho provato e ho funzionato, ma non sono sicuro se sia una soluzione efficiente o se possa essere eseguita meglio.

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 

Come posso fare questo in modo più efficiente?

Grazie!

+0

Perché non è possibile utilizzare 'LIMIT'? – Kermit

+1

@njk "Si è verificato un errore nella sintassi SQL, controllare il manuale corrispondente alla versione del server MySQL per la sintassi corretta da utilizzare vicino a" LIMIT 1 "alla riga 5" Apparentemente non è possibile utilizzare LIMIT con LEFT JOIN – Santiago

risposta

8

Non è possibile utilizzare LIMIT direttamente all'interno DELETE quando si fa riferimento a tabelle multiple allo stesso tempo, ma si può andare in giro che incassa ciò che si desidera eliminare all'interno di una selezione secondaria:

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 ' scusa, cosa sarebbe "p.id"? Sono abbastanza nuovo in MySQL – Santiago

+0

@Santiago, questa è solo la chiave primaria del tavolo 'post'. Ora vedo che è 'postid' invece di' id', aggiustando la mia soluzione ora. –

+0

@ zane-bien Puoi usare 'LIMIT' direttamente, solo non nella sintassi multi-tabella. – Kermit

0

Qualcosa come questo forse?

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) 

È possibile sostituire MAX(postid) con MIN() e aggiungere il limite ad esso.