我有一个包含三列的表,obj1,obj2(两个varchars)和对象之间的距离。不幸的是,数据的构建方式,我的条目数量增加了一倍,例如,
obj1 obj2 distance
c1 c2 10.5
c2 c1 10.5
我想要的是能够删除列出的其中一个条目。我曾经想过并试图使用Exists子句,但没有运气。我想知道这是否需要存储过程?
任何帮助都会感激不尽! 吉姆
答案 0 :(得分: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)
最后一个句子(a.a > b.a
)同样可能是a.a < b.a
,我们只需要决定哪一个双打应该去。
答案 1 :(得分:-1)
如果您可以保证每一行都有一个“重复”,obj1和obj2值相反,那么您可以通过执行
为每个副本删除一个这样的行DELETE FROM dist WHERE obj1 > obj2
其中dist
是您的表名。
如果您的表中的行obj1
等于obj2
,那么您可以在(obj1,obj2)上创建唯一索引:
ALTER IGNORE TABLE dist ADD UNIQUE INDEX dist_index (obj1,obj2)
只要不满足唯一索引约束,上面的命令就会从表中删除行。 (obj1等于obj2的第一行,将保留该行,因为仍然满足唯一索引约束。将删除obj1等于obj2的第二行,因为第二行与唯一性约束相矛盾。)
您可以选择保留唯一索引,或者,如果您希望删除它,则命令将为:
ALTER TABLE dist DROP INDEX dist_index