2012-06-05 5 views
1

Je les résultats en double, comme ci-dessous où une colonne peut avoir des données et ne peuvent pasMysql requête pour supprimer les doublons

| contact_info | icon | id | title   | lastmodified_by | 
+--------------+------+-----+---------------+------------------+ 
|   169 | 305 | 123 | Whakarewarewa | 2011100400305262 | 
|   NULL | NULL | 850 | Whakarewarewa | NULL    | 
+--------------+------+-----+---------------+---------------- 



| contact_info | icon | id | title   | lastmodified_by | 
+--------------+------+-----+---------------+------------------+ 
|   NULL | NULL | 123 | Paris   | NULL    | 
|   NULL | NULL | 850 | Paris   | NULL    | 
+--------------+------+-----+---------------+---------------- 

Je veux supprimer l'enregistrement ayant moins de données et si l'ensemble des valeurs de champ sont exactement les mêmes, puis supprimer n'importe quelle rangée. Il y a mille enregistrements comme celui-ci.

+0

Supprimer où id = 850? – Nanne

+0

Il est évident qu'il y aurait plusieurs enregistrements sinon je n'aurais pas posé cette question ici sur stackoverflow. –

+0

Cette question a été interrogée trillions de temps, [ici] (http://stackoverflow.com/questions/672702/how-to-delete-duplicates-in-mysql-table), [ici] (http: // stackoverflow. com/questions/2469006/comment-supprimer-duplique-dans-mysql-using-case), [ici] (http://stackoverflow.com/questions/2630440/how-to-delete-duplicates-on-mysql -table), [ici] (http://stackoverflow.com/questions/3383898/remove-duplicates-using-only-a-mysql-query), [ici] (http://stackoverflow.com/questions/6308924/modification-un-mysql-query-that-supprime-duplique) ... –

Répondre

3

Essayez cette solution en deux étapes:

Exécutez cette requête pour vew tous les doublons - enregistrement ayant moins de données -

SELECT t1.* FROM table t1 
    JOIN (
    SELECT 
     title, 
     MIN(IF(contact_info IS NULL, 0, 1) + IF(contact_info IS NULL, 0, 1) + IF(lastmodified_by IS NULL, 0, 1)) min_value_data, 
     MAX(IF(contact_info IS NULL, 0, 1) + IF(contact_info IS NULL, 0, 1) + IF(lastmodified_by IS NULL, 0, 1)) max_value_data 
    FROM table GROUP BY title HAVING min_value_data <> max_value_data 
) t2 
    ON t1.title = t2.title AND IF(t1.contact_info IS NULL, 0, 1) + IF(t1.contact_info IS NULL, 0, 1) + IF(t1.lastmodified_by IS NULL, 0, 1) <> t2.max_value_data 

Rewrite à SUPPRIMER déclaration et exécuter.


Ensuite, exécutez cette requête pour supprimer tous les doublons sauf min ID:

DELETE t1 FROM table t1 
    JOIN (SELECT MIN(id) id, title FROM table GROUP BY title) t2 
    ON t1.id <> t2.id AND t1.title = t2.title; 
+0

Que se passe-t-il si un enregistrement avec l'ID min n'a aucune donnée mais que l'ID max contient des données? Il va supprimer id avec max id et garder id avec min id ??? –

+0

Oui, vous avez raison. J'ai lu votre question éditée; et la requête devrait être réécrite. – Devart

+0

J'ai ajouté une nouvelle requête. – Devart

1

Utilisez cette option pour sélectionner les doublons, ne hésitez pas à modifier ce une déclaration de suppression:

SELECT * FROM `test`, 
(SELECT title, count(title) AS ttl 
FROM `test` 
GROUP BY title 
HAVING ttl >1) AS sub 

WHERE test.title = sub.title 
AND contact_info IS NULL AND lastmodified_by IS NULL 
+0

Cette requête échoue dans le cas Where title = Paris. Il liste à la fois le Paris dans le résultat. C'est le cas où les deux résultats sont des doublons exacts incluant tous les champs –

+1

Correct, je n'ai pas vu votre exemple de Paris. Que diriez-vous ceci: lignes affichage 0 - 1 (2 au total, la requête a 0,0007 s) SELECT * FROM ' test' AS principal, ( titre SELECT, COUNT (titre) AS ttl FROM' test' GROUP BY titre AYANT ttl> 1 ) AS sous OU main.title = sub.title ET main.contact_info IS NULL ET main.lastmodified_by IS NULL GROUP BY main.contact_info, main.icon, main.title , main.lastmodified_by –

+0

Cette requête est presque correcte sauf la partie dans laquelle les lignes à modifier ou à supprimer ne peuvent pas être r référencé dans Subquery.so je ne peux pas supprimer en utilisant cette requête –

0

principal table = tes1

Créer temp

CREATE TABLE TEMPORAIRE mon_temp (id INT (20) NOT NULL) MOTEUR = MEMOIRE;

Remplissez avec id pour enlever

INSERT INTO My_Temp (id) id SELECT FROM TES1 AS principal, (titre SELECT, count (titre) AS ttl DU GROUPE TES1 PAR titre AYANT ttl> 1) sous OÙ main.title = sub.title AND main.contact_info EST NULL ET main.lastmodified_by EST GROUPE NULL PAR main.contact_info, main.icon, main.title, main.lastmodified_by;

Supprimer!

SUPPRIMER DE tes1 O WH ID IN (sélectionner id depuis my_temp);

Nettoyage, remarque: en avons-nous vraiment besoin?

DROP TABLE my_temp;

Questions connexes