gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:18:42 25 4
gpt4 key购买 nike

假设我有一个表,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com