说我有一张桌子,夫妻有Person1和Person2字段,例如。
Bob | Alice
Ted | Mary
Bob | Alice
Jim | Jane
删除像Bob | Alice
这样的重复内容会很容易,但是说数据是随意输入的,而且我有两次夫妻俩却反转过来了:
Bob | Alice
Ted | Mary
Jane | Jim
Jim | Jane
如何根据两个字段在任一顺序中相同的格式来删除要删除的选择/删除?我认为独特的指数不会在这里发挥作用。
答案 0 :(得分:2)
如果你的情侣表有一个id列。
您可以使用此查询删除重复项(考虑'Bob','Alice'
被认为是'Alice','Bob'
的副本)
DELETE FROM Couples
WHERE ID NOT IN (SELECT * FROM
(SELECT MIN(id) as min_id
FROM Couples
GROUP BY LEAST(person1,person2),
GREATEST(person1,person2)
)T
);
http://sqlfiddle.com/#!9/fe81f/1
子查询的作用是通过LEAST(person1,person2),GREATEST(person1,person2)获得每个分组的最小ID。这意味着Bob,Alice
和Alice,Bob
被视为同一组。
然后外部删除语句删除不在最小ID列表中的行(重复行)...额外的SELECT *只是为了欺骗Mysql从其子查询中的同一个表中删除。
更新对于使用IN
或NOT IN
的数百万行,可能会导致速度问题。所以尝试下面的查询它会做同样的但是使用连接而不是NOT IN
并查看它是否更快
DELETE C1
FROM Couples C1
INNER JOIN
(SELECT MIN(id) as min_id,
LEAST(person1,person2) as per1,
GREATEST(person1,person2) as per2
FROM Couples
GROUP BY per1,per2
)C2
ON C1.id > C2.min_id
AND LEAST(C1.person1,C1.person2) = C2.per1
AND GREATEST(C1.person1,C1.person2) = C2.per2
;