2012-09-22 35 views
2

我有一个MySQL表看起来删除从MySQL表中的重复数据,如:
(UNIQUE_ID,uid_data1,uid_data2,sorting_data1,sorting_data2)翻过两列

此表中的工具,其中双向关系间没有使用直到现在才支持,所以该表包含看起来像的数据(根据上面的行顺序):
(1,1212,2034,1,1)
(2,2034,1212,1,1)
(3,45667,9876,1,0)
(4,9886,4567,0,1)

该表中也包含 “单定向” 的关系,即
(5,5566,8899,1,9)
=>无行存在(?,8899,5566,9,1)

由于该工具现在支持双向/对称关系,我想从mysql表中删除重复的数据 - 但是我在查找适当的查询时遇到了一些麻烦。
在上述我的例子中我想用的UID 2和4删除行(它们的数据已被存储在所述行1和3

首先,我试图设置一个SELECT-语句看,该条目将被删除。
我想到了一个JOIN查询

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

这不会在语法上是准确的,但类似'从tx_sdfilmbase_hilfstab中删除uid_link2(从tx_sdfilmbase_hilfstab中选择uid_link1)'可能会起作用... –

+0

但后来我可能会删除(2233,1122),(5566,1122)=>这两个(2233,1122)和(5566,1122)将被删除,但是, 1122)应该被删除,因为(5566,1122)没有重复输入 – Stefan

回答

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 

应该做的工作

+0

这比拥有WHERE子句更好。谢谢! – Stefan

+0

这是我必须自己解决一次或两次的问题。 :(:( –

+0

Hm ... SELECT语句完美工作,但DELETE似乎不起作用 - 它表示存在语法错误...但是,根据手册,应允许JOIN用于DELETE - 陈述 – Stefan

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

+0

尼斯,“WHERE x.unique_id Stefan