假设我有一个表,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,Alice
和 Alice,Bob
为每个分组获取最小 id code> 被视为同一组。
然后外部删除语句删除不在最小id列表中的行(重复的行)...额外的SELECT *只是为了欺骗Mysql从其子查询中的同一个表中删除。
UPDATE 对于数百万行,使用 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
;
关于mysql - 基于两个在 MySql 中可以具有相反值的字段删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36902869/