2012-06-09 4 views
0

Je suis en train d'exécuter la requête SQL ci-dessous, mais je reçois une erreur 505 après un long moment d'attente. La table wp_posts tient beaucoup plus que 50 000 lignes ... le but étant de supprimer les messages doublons qui sont environ 50 000 lignesSuppression de 50 000 lignes sans erreur 505

DELETE bad_rows.* 
FROM wp_posts AS bad_rows 
INNER JOIN 
(
    SELECT post_title, MIN(id) as min_id 
    FROM wp_posts 
    GROUP BY post_title 
    HAVING count(*) > 1 
) AS good_rows 
ON good_rows.post_title = bad_rows.post_title 
AND good_rows.min_id <> bad_rows.id; 

Toute idée sur la façon d'avoir cette optmized et courir?

+0

Pourriez-vous déposer juste la table recréer ensuite? –

+0

le but n'est pas de supprimer toutes les lignes, mais seulement les messages en double – Steve

+0

Qu'en est-il un choix sur les tables, comparez avec PHP, puis interroger une suppression –

Répondre

4

Ne pensez pas que vous devez utiliser une sous-requête. Cela sélectionnera toutes les paires de publications avec les mêmes titres.

SELECT a.id, b.id 
FROM wp_posts a 
LEFT JOIN wp_posts b 
ON a.post_title = b.post_title 
WHERE a.id > b.id 

Si vous souhaitez conserver le message le plus ancien, supprimez tous les messages avec l'ID a.id. Si vous souhaitez conserver le post le plus récent, supprimez tous les messages avec id b.id.


Alors, pour garder le plus ancien poste:

DELETE FROM wp_posts a 
LEFT JOIN wp_posts b 
ON a.post_title = b.post_title 
WHERE a.id > b.id 

Pour garder le plus récent message:

DELETE FROM wp_posts a 
LEFT JOIN wp_posts b 
ON a.post_title = b.post_title 
WHERE a.id < b.id 
+0

Les erreurs suivantes ont été signalées: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'WHERE a.id <> b.id' à la ligne 7 – Steve

+0

Oh, 'HAVING' vient après' WHERE'. Ma faute. – ddlshack

+0

Mise à jour de mon message à nouveau. – ddlshack

Questions connexes