mysql - 基于两个在 MySql 中可以具有相反值的字段删除重复项

标签 mysql duplicates

假设我有一个表,Couples 包含 Person1 和 Person2 字段,例如

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

删除重复项,如 Bob | Alice 会很容易,但说数据是随意输入的,我有一些情侣输入了两次,但颠倒了:

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

如何格式化一个选择/删除,该选择/删除将基于两个字段在任一顺序中都相同而删除?我认为唯一索引在这里不起作用。

最佳答案

如果您的 Couples 表有一个 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)..这意味着 Bob,AliceAlice,Bob 为每个分组获取最小 id code> 被视为同一组。 然后外部删除语句删除不在最小id列表中的行(重复的行)...额外的SELECT *只是为了欺骗Mysql从其子查询中的同一个表中删除。

UPDATE 对于数百万行,使用 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

关于mysql - 基于两个在 MySql 中可以具有相反值的字段删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36902869/

相关文章:

Mysql性能差

javascript - 如何减少重复的javascript函数?

删除一行中的重复字符串

c# - 订购字典

php - 使用PHP上传文件到MySQL数据库

javascript - 错误lib sprintf nodejs restify mysql

MySQL 自动递增 : Is there any way to reassign IDs starting from 1?

mysql - 在 C 中为 WinCE 使用 .NET CF dll

python - 处理 pandas DF 中的重复索引

python - 数字在 Pandas DataFrame 中按顺序重复