Correction des dernières erreurs
Malgré un bon fonctionnement du script, j'observe parfois quelques erreurs étranges : certains champs vides ou inexistants dans les pages web, ont tendance à se remplir en BDD avec les valeurs respectives du dernier enregistrement non-vide. Très pénible... Cela ne se produit pas depuis tous les sites inspectés, je n'ai pas compris pourquoi, mais vérifiez vos données avant de les utiliser.
Heureusement nous avons ajouté un identifiant auto-incrémenté dans notre table. Avec le code ci-dessous nous allons pouvoir corriger les erreurs en vidant les doublons en fonction de leur ordre d'apparition en base. Exemple sur un champ website, la table d'origine s'appelle ici ma_table :
DROP TABLE IF EXISTS tmp_website_duplicates ; CREATE TABLE tmp_website_duplicates AS SELECT website, min(id) as min_id, count(id) as total FROM ma_table GROUP BY website HAVING website NOT LIKE '' AND total > 1 ORDER BY total DESC ; DROP TABLE IF EXISTS tmp_id_website_to_delete ; CREATE TABLE tmp_id_website_to_delete AS SELECT tmp_website_duplicates.website, min_id, id as id_website_to_delete FROM tmp_website_duplicates INNER JOIN ma_table ON tmp_website_duplicates.website = ma_table.website AND min_id <> id ORDER BY min_id, id ; UPDATE ma_table INNER JOIN tmp_id_website_to_delete ON ma_table.id = tmp_id_website_to_delete.id_website_to_delete SET ma_table.website = '' ; DROP TABLE IF EXISTS tmp_website_duplicates, tmp_id_website_to_delete ;
La 1ère table liste les websites en doublons, les compte, mais surtout renvoie l'id du 1er enregistrement de chaque lot de doublons apparus en base (l'id le plus bas, celui qui ne doit pas être modifié).
La 2nd trie les ids des websites en doublons : d'un côté les 1ers apparus en base, de l'autre les derniers ids suivants (ceux qui doivent être modifiés).
Ensuite une requête de mise-à-jour vide les champs en doublons des derniers ids des lots de doublons de votre table d'origine, sans toucher aux premiers ids.
Hop ! Faîtes ainsi pour tous les champs ayant subi des intrusions.