2009-09-08 9 views
1

J'ai une table comme ceci:Afficher tous les doublons, côte à côte, dans MySQL

Table eventlog 
user | user_group | event_date | event_dur. 
----  ---------- ---------  ---------- 
xyz   1   2009-1-1  3.5 
xyz   2   2009-1-1  4.5 
abc   2   2009-1-2  5 
abc   1   2009-1-2  5 

Notez que dans les données ci-dessus de l'échantillon, la seule chose que la date est fiable et l'utilisateur. Grâce à un sur site qui est à 90% à blâmer, j'ai réussi à permettre aux utilisateurs de dupliquer leurs entrées quotidiennes. Dans certains cas, les doublons étaient censés être des mises à jour de leur durée, dans d'autres, c'était leur tentative de changer le groupe d'utilisateurs avec lequel ils travaillaient ce jour-là, et dans d'autres cas, les deux.

Heureusement, j'ai une idée assez forte (puisqu'il s'agit d'une mise à jour d'un système plus ancien) dont les enregistrements sont corrects. (Fondamentalement, tout cela est arrivé comme une tentative de fusionner l'ancienne DB avec la nouvelle DB).

Malheureusement, je dois plus ou moins le faire à la main, ou le risque de perdre des données qui n'existe que d'un côté et pas l'autre ....

Longue histoire courte, je suis en train de comprendre la bonne requête MySQL pour retourner tous les enregistrements qui ont plus d'une entrée pour un utilisateur à une date donnée. J'ai lutté avec GROUP BY et HAVING, mais le mieux que je peux obtenir est une liste de l'un des deux doublons, par doublon, ce qui serait génial si je savais bien que c'était le mauvais.

est ici le plus proche, je suis venu:

SELECT * 
FROM eventlog 
GROUP BY event_date, user 
HAVING COUNT(user) > 1 
ORDER BY event_date, user 

Toute aide à ce serait extrêmement utile. Si besoin est, j'ai la liste des utilisateurs/date pour chaque ensemble de doublons, donc je peux y aller à la main et supprimer tous les 400, mais je préfère les voir tous en même temps.

Merci!

+0

J'ai eu un problème similaire et ont travaillé en sélectionnant la sortie d'un groupe par requête (comme le vôtre) dans une nouvelle table, jeter ensuite l'original Les données. –

+0

Cela pourrait aider si je les "UNION" ensemble. Mais je dois en passer un par un pour déterminer lequel conserver et lequel supprimer. – Anthony

Répondre

1

Est-ce que cela fonctionnerait? Ce qui me décourage, c'est la clause COUNT (user) que vous avez.

+0

Je pensais que je devais avoir quelque chose dans ce 'COUNT()' pour spécifier quelle colonne avait les données en double (lequel a été dupliqué dans un mauvais sens?), De toute façon, tester maintenant ... – Anthony

+0

Rats, mêmes résultats. Toujours juste obtenir un ensemble de doublons, pas les deux. Je sais que c'est un problème avec le GROUPE PAR – Anthony

+0

Est-il possible que votre champ de date inclue une valeur d'horodatage (par exemple, 16h00)? Cela peut exclure ce qui ressemblerait autrement à une paire. –

1

Vous pouvez répertorier toutes les valeurs de champ des doublons avec la fonction GROUP_CONCAT, mais vous obtenez toujours une ligne pour chaque ensemble.

1

Je pense que cela fonctionnerait (non testé)

SELECT * 
FROM eventlog e1 
WHERE 1 < 
(
    SELECT COUNT(*) 
    FROM eventlog e2 
    WHERE e1.event_date = e2.event_date 
    AND  e1.user = e2.user 
) 
-- AND [maybe an additionnal constraint to find the bad duplicate] 
ORDER BY event_date, user; 
; 
Questions connexes