2012-08-30 52 views
5

Estoy intentando eliminar mensajes huérfanos en mi base de datos y he creado esta consulta:elimine usando LEFT JOIN con LIMIT en MySQL

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

El problema es que yo quiero limitar porque mi tabla tiene más de 7.000.000 archivos.

Como no puedo usar LIMIT con la consulta, probé esto y realmente funcionó, pero no estoy seguro de si es una solución eficiente o si se podría hacer mejor.

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 

¿Cómo puedo hacer esto de manera más eficiente?

Gracias!

+0

¿Por qué no puedes usar 'LIMIT'? – Kermit

+1

@njk "Tiene un error en su sintaxis SQL, consulte el manual que corresponde a su versión de servidor MySQL para la sintaxis correcta para usar cerca de 'LIMIT 1' en la línea 5" Aparentemente no puede usar LIMIT con IZQUIERDA UNIRSE – Santiago

Respuesta

8

No se puede utilizar directamente en LIMITDELETE cuando se está haciendo referencia a varias tablas al mismo tiempo, pero se puede conseguir alrededor de eso por que encierra lo que quiere borrar dentro de una subselección:

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 ' Lo siento, ¿qué sería "p.id"? Soy bastante nuevo en MySQL – Santiago

+0

@Santiago, esa es solo la clave principal de la tabla 'post'. Ahora veo que es 'postid' en lugar de' id', ajustando mi solución ahora. –

+0

@ zane-bien Puede usar 'LIMIT' directamente, pero no en la sintaxis de tablas múltiples. – Kermit

0

Algo como este tal vez?

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) 

Puede reemplazar MAX(postid) con MIN() y añadir el límite a la misma.