2012-08-16 4 views
0

Dans PHPMYAdmin, je cours un robot d'indexation Web. le robot d'exploration Web récupère parfois les mêmes URL. Dans le robot d'indexation Web, il a indexé des milliers de liens, et je ne veux pas de liens en double. est-il possible de supprimer des lignes similaires dans SQL (la seule différence étant le champ id)Supprimer des lignes très similaires dans MYSQL

+0

Le champ 'id' est-il un champ INT auto-incrémenté? –

+0

oui c'est un champ auto-incrémenté –

Répondre

0

Si votre table est nommée the_table et ses champs sont id (un champ unique) et url, vous pouvez écrire:

DELETE 
    FROM the_table 
WHERE id NOT IN 
     (SELECT * 
      FROM (SELECT MIN(id) 
        FROM the_table 
        GROUP BY url 
       ) t 
     ) 
; 

(Si vous avez d'autres domaines aussi bien, et seulement à supprimer les lignes où tous champs sont identiques, sauf id, puis il suffit d'ajouter ces champs à la clause GROUP BY ainsi url.)

+0

Juste pour info, vous ne pouvez pas référencer la même table dans une sous-requête dans une opération DELETE. Il lancera cette erreur: '# 1093 - Vous ne pouvez pas spécifier la table cible 'the_table' pour la mise à jour dans la clause FROM'. –

+0

@ZaneBien: Oh, j'ai oublié ça. Darn MySQL. Fixé maintenant, merci. :-) – ruakh

+0

ne fait pas ce que je demande, j'ai demandé de supprimer les données en double ce qui ne faisait pas partie de l'étiquette d'identification –

1

Vous pouvez DELETE toutes les URL, sauf celui avec l'ID maximale (le plus récent):

DELETE a 
FROM  tbl a 
LEFT JOIN (
      SELECT MAX(id) AS id 
      FROM  tbl 
      GROUP BY url 
     ) b ON a.id = b.id 
WHERE  b.id IS NULL 

Une fois que vous faites cela, il pourrait être une bonne idée de mettre en place une contrainte unique sur le champ URL:

ALTER TABLE tbl ADD UNIQUE idx_unique_url (url); 
Questions connexes