2

我有一个 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, 5566, 8899, 1, 9)
=> (?, 8899, 5566, 9, 1) 不存在行

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

首先,我尝试设置一个 SELECT-Statement 来查看哪些条目将被删除。
我想到了一个 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 只选择记录的“一半”的地步。
关于如何做到这一点的任何建议?

PS 在表中手动删除每条记录不是一种选择,因为该表包含数千行;-)

4

2 回答 2

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

应该做的工作

于 2012-09-22T19:55:21.283 回答
1

所以,这一行将是

uid_link1=1,uid_link2=9

和另一个

uid_link1=9 和 uid_link2=1

对?

关于什么

.. 哪里 x.uid_link1 < y.uid_link1 ...

但这不会删除带有 uid_link1=uid_link2 的重复项

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

于 2012-09-22T19:44:39.223 回答