2010-11-04 7 views
1

J'ai une table avec trois colonnes, obj1, obj2 (les deux varchars) et la distance entre les objets. Malheureusement, la façon dont les données ont été construit, j'ai le double du nombre d'entrées, par exemple,Suppression d'entrées en double d'une base de données Mysql

obj1  obj2  distance 
c1  c2   10.5 
c2  c1   10.5 

Voulez-vous que je veux est d'être en mesure de supprimer l'une des mentions figurant. J'ai pensé et essayé d'utiliser la clause Exists, mais je n'ai pas eu de chance. Je me demande si cela nécessite une procédure stockée?

Toute aide serait grandement appréciée! Jim

Répondre

-1

Si vous pouvez garantir que chaque ligne a un « double » avec obj1 et les valeurs obj2 inversées, vous pouvez supprimer une telle ligne pour chaque double en faisant

DELETE FROM dist WHERE obj1 > obj2 

dist est le nom de ta table.

Si votre table contient des lignes où obj1 égaux obj2, alors vous pourriez faire un index unique sur (obj1, obj2):

ALTER IGNORE TABLE dist ADD UNIQUE INDEX dist_index (obj1,obj2) 

La commande ci-dessus chutera lignes de la table à chaque fois que la contrainte d'index unique est pas satisfait. (La première ligne où obj1 est égal à obj2, la ligne sera conservée car la contrainte d'index unique est toujours satisfaite.La deuxième ligne où obj1 est égal à obj2 sera supprimée car la deuxième ligne contredit la contrainte d'unicité.)

choisir de garder l'index unique, ou, si vous souhaitez déposer, la commande serait:

ALTER TABLE dist DROP INDEX dist_index 
+0

Cela a fonctionné très bien merci! – James

1
mysql> create table doubles(a int,b int,c int); 
Query OK, 0 rows affected (0.11 sec) 

mysql> insert into doubles values (1,2,10),(2,1,10),(1,3,12),(3,1,12),(2,3,13); 
Query OK, 5 rows affected (0.00 sec) 
Records: 5 Duplicates: 0 Warnings: 0 

mysql> select * from doubles; 
+------+------+------+ 
| a | b | c | 
+------+------+------+ 
| 1 | 2 | 10 | 
| 2 | 1 | 10 | 
| 1 | 3 | 12 | 
| 3 | 1 | 12 | 
| 2 | 3 | 13 | 
+------+------+------+ 
5 rows in set (0.00 sec) 

mysql> DELETE a FROM doubles a JOIN doubles b ON a.a = b.b AND a.b = b.a AND a.a > b.a; 
Query OK, 2 rows affected (0.03 sec) 

mysql> select * from doubles; 
+------+------+------+ 
| a | b | c | 
+------+------+------+ 
| 1 | 2 | 10 | 
| 1 | 3 | 12 | 
| 2 | 3 | 13 | 
+------+------+------+ 
3 rows in set (0.00 sec) 

la dernière clause (a.a > b.a) pourrait également être a.a < b.a, il suffit de décider lequel des les doubles devraient partir.

+0

J'ai des problèmes pour faire ce travail, j'ai essayé de jouer avec cela, en arrivant à – James

+0

Désolé accidentellement pressé return.ysql> supprimer FROM spectramatches_2 comme sa JOIN spectramatches_2 comme sb ON sa.spectra1 = sb.spectra2 ET sa.spectra2 = sb .spectra1 ET sa.spectra1> sb.spectra1; ERREUR 1064 (42000): Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'comme sa JOIN spectramatches_2 comme sb ON sa.spectra1 = sb.spectra2 ET sa.spectra2' à la ligne 1 – James

+0

La définition de la table est mysql> décrire spectramatches_2 ->; + --------------- + ------------- + ------ + ----- + ----- ---- + ------- + | Champ | Type | Nul | Clé | Par défaut | Extra | + --------------- + ------------- + ------ + ----- + ----- ---- + ------- + | core1 | varchar (10) | OUI | | NULL | | | distance_c1s1 | double | OUI | | NULL | | | spectra1 | varchar (10) | OUI | | NULL | | | distance_s1s2 | double | OUI | | NULL | | | spectra2 | varchar (10) | OUI | | NULL | | | distance_c2s2 | double – James

Questions connexes