从两列中删除mysql表中的重复数据

时间:2012-09-22 19:29:40

标签: mysql duplicate-removal

我有一个MySQL表,看起来像:
(unique_id,uid_data1,uid_data2,sorting_data1,sorting_data2)

此表用于直到现在都不支持双向关系的工具中,因此该表包含看起来像的数据(上面的字段顺序):
(1,1212,2034,1,1)
(2,2034,1212,1,1)
(3,4567,9876,1,0)
(4,9876,4567,0,1)

该表还包含“单向”关系,即
(5,5556,8899,1,9)
=> (?,8899,5566,9,1)没有行

由于该工具现在支持双向/对称关系,我想从mysql表中删除重复数据 - 但是我在查找相应的查询时遇到了一些麻烦。
在上面的示例中,我想删除带有uid 2和4的行(因为它们的数据已经存储在第1行和第3行中。

首先,我尝试设置一个SELECT语句来查看哪些条目将被删除 我想到了一个JOIN-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

然而,我不得不告诉MySQL只选择记录的“半部分” 有关如何做到这一点的任何建议吗?

P.S。在表中手动删除每个单个记录不是一个选项,因为该表包含几千行; - )

2 个答案:

答案 0 :(得分: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

应该找到该对的“第二”部分(在您的示例中记录2和4)

如果我做得对,那么

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

应该做的工作

答案 1 :(得分:1)

所以,一行将是

  

uid_link1 = 1,uid_link2 = 9

和另一个

  

uid_link1 = 9且uid_link2 = 1

正确?

怎么样

  

.. WHERE x.uid_link1< y.uid_link1 ...

但这不会删除uid_link1 = uid_link2

的重复项

编辑:或者您可以使用... WHERE x.unique_id< y.unique_id