我有一个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。在表中手动删除每个单个记录不是一个选项,因为该表包含几千行; - )
答案 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