我有一张表如下
Col1 Col2
12 34
34 12
考虑到,这些是重复我们如何删除它们? 我尝试使用自联接来解决这个问题。但我无法得到所需的答案。有人可以帮忙吗?
答案 0 :(得分:4)
您可以使用GREATEST和LEAST来订购'您的列,然后使用distinct:
SELECT DISTINCT GREATEST(col1, col2) as first, LEAST(col1, col2) as second from yourTable
这会给你一个明显的结果。如果您要查找的内容是删除,则可以删除此结果中未包含的所有内容:
DELETE FROM yourTable where (col1, col2) NOT IN (
SELECT DISTINCT GREATEST(col1, col2) as first, LEAST(col1, col2) as second from yourTable
)
答案 1 :(得分:1)
我假设您想要一个对称关系:例如,如果A是B的朋友,那么B也是A的朋友?我还假设两列都是外来ID和数字。如果不是这样,你将不得不适应。
最好的方法是永远不要插入两个版本;规范化关系,使较小的一个始终在Col1中,较大的一个始终在Col2中。即对于13 -> 27
,您会插入[13, 27]
;对于27 -> 13
,如果它不再出现,您将再次插入[13, 27]
。
如果你已经搞乱了,我可能只会这样做:
UPDATE IGNORE t
SET col1=(@temp:=col1), col1 = col2, col2 = @temp
WHERE col1 > col2;
将其标准化(没有尝试,可能有错误;同样,MySQL语法,你可能必须适应其他引擎);如果存在两个方向,则删除附加内容:
DELETE FROM t
WHERE col1 > col2;
答案 2 :(得分:0)
MySQL语法:
DELETE b
FROM mytable a, mytable b
WHERE a.col1 = b.col2 AND a.col2 = b.col1 AND a.col1 > b.col2;
如果两个值相同,它不起作用,但在这种情况下你有一个独特的约束来防止重复,对吗?