2012-09-22 3 views
2

J'ai une table MySQL qui ressemble à:
(id_unique, uid_data1, uid_data2, sorting_data1, sorting_data2)Supprimer les données en double de la table mysql accross deux colonnes

Ce tableau est utilisé dans un outil, où les relations bidirectionnelles weren « t supporté jusqu'à présent, de sorte que la table contient des données qui ressemble (ordre champ ligne selon ci-dessus):
(1, 1212, 2034, 1, 1)
(2, 2034, 1212, 1, 1)
(3, 4567, 9876, 1, 0)
(4, 9876, 4567, 0, 1)

Le tableau contient également des "single-directed" relations, à savoir
(5, 5566, 8899, 1, 9)
=> aucune ligne existe pour (?, 8899, 5566, 9, 1)

Comme l'outil prend désormais en charge les relations bidirectionnelles/symétriques, je voudrais supprimer les données en double de la table mysql - mais j'ai quelques difficultés à trouver une requête appropriée pour le faire.
Dans l'exemple ci-dessus je voudrais supprimer les lignes avec les uids 2 et 4 (car leurs données sont déjà stockées dans les rangées 1 et 3.

D'abord, j'ai essayé de configurer un SELECT-Statement pour voir, les entrées seraient supprimés.
Je pensais que d'un REJOIGNEZ-Query

SELECT x.uid, x.uid_link1, x.uid_link2, y.uid_link1 as 'uid_link2', y.uid_link2 as 'uid_link1' 
FROM tx_sdfilmbase_hilfstab x 
INNER JOIN tx_sdfilmbase_hilfstab y ON x.uid_link1=y.uid_link2 AND x.uid_link2=y.uid_link1 
WHERE ??? 
ORDER BY x.uid_link1, x.uid_link2 

Cependant, je suis coincé au point où je dois dire MySQL pour ne sélectionner que « partie de la moitié » des dossiers.
Tout suggestions sur la façon de faire cela?

P.S. Suppression de chaque enregistrement unique manuellement dans le tableau ne sont pas une option, comme la table contient plusieurs milliers de lignes ;-)

+0

Cela ne va pas être syntactiquement précis, mais quelque chose comme 'supprimer de tx_sdfilmbase_hilfstab où uid_link2 dans (sélectionnez uid_link1 de tx_sdfilmbase_hilfstab)' pourrait fonctionner ... –

+0

mais alors je pourrais être dele des lignes sans double entrée, comme: (1122, 2233), (2233, 1122), (5566, 1122) => ici les deux (2233, 1122) et (5566, 1122) seraient supprimés, bien que seulement (2233, 1122) devrait être supprimé, car (5566, 1122) n'a pas de double entrée – Stefan

Répondre

4
Select t.* from MyTable t 
inner join MyTable tt 
On t.uid_data1 = tt.uid_data2 and t.uid_data2 = tt.uid_data1 and t.unique_ID > tt.unique_ID 

devrait trouver la « deuxième » partie de la paire (enregistrements 2 et 4 dans votre exemple)

Si je l'ai eu tout de suite

Delete t from MyTable t 
inner join MyTable tt 
On t.uid_data1 = tt.uid_data2 and t.uid_data2 = tt.uid_data1 and t.unique_ID > tt.unique_ID 

devrait faire le travail

+0

C'est encore mieux que d'avoir une clause WHERE. THX! – Stefan

+0

C'est un problème que j'ai dû résoudre moi-même une ou deux fois. :(:( –

+0

Hm ... Le SELECT-Statement fonctionne parfaitement, mais le DELETE ne semble pas fonctionner - il dit qu'il y a une erreur de syntaxe ... Cependant, selon le manuel, JOINs devrait être autorisé pour DELETE -Statements – Stefan

1

Ainsi, une ligne sera

uid_link1 = 1, uid_link2 = 9

et l'autre

uid_link1 = 9 et uid_link2 = 1

à droite?

Qu'en est-

.. OÙ x.uid_link1 < y.uid_link1 ...

mais ce ne sera pas supprimer les doublons avec uid_link1 = uid_link2

modifier: ou vous pouvez utiliser ... OERE x.unique_id < y.id_unique

+0

Nice, "WHERE x.unique_id Stefan

Questions connexes