根据MySql中可能具有反向值的两个字段删除重复项

时间:2016-04-27 23:49:59

标签: mysql duplicates

说我有一张桌子,夫妻有Person1和Person2字段,例如。

Bob  | Alice
Ted  | Mary
Bob  | Alice
Jim  | Jane

删除像Bob | Alice这样的重复内容会很容易,但是说数据是随意输入的,而且我有两次夫妻俩却反转过来了:

Bob  | Alice
Ted  | Mary
Jane | Jim
Jim  | Jane

如何根据两个字段在任一顺序中相同的格式来删除要删除的选择/删除?我认为独特的指数不会在这里发挥作用。

1 个答案:

答案 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,AliceAlice,Bob被视为同一组。 然后外部删除语句删除不在最小ID列表中的行(重复行)...额外的SELECT *只是为了欺骗Mysql从其子查询中的同一个表中删除。

更新对于使用INNOT 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
;

http://www.sqlfiddle.com/#!9/f243e/1