5

我用来做

SELECT email, COUNT(email) AS occurences
FROM wineries
GROUP BY email
HAVING (COUNT(email) > 1);

根据他们的电子邮件查找重复项。

但现在我需要他们的 ID 才能准确定义要删除的 ID。

第二个约束是:我只想要 LAST INSERTED 重复项。

因此,如果有 2 个条目以 test@test.com 作为电子邮件,并且它们的 ID 分别为 40 和 12782,它将仅删除 12782 条目并保留 40 条目。

关于我如何做到这一点的任何想法?我已经捣碎了大约一个小时的 SQL,但似乎无法确切地找到如何做到这一点。

感谢,并有一个愉快的一天!

4

5 回答 5

5

好吧,你有点回答你的问题。你似乎想要max(id)

SELECT email, COUNT(email) AS occurences, max(id)
FROM wineries
GROUP BY email
HAVING (COUNT(email) > 1);

您可以使用该语句删除其他人。Delete withjoin有一个棘手的语法,您必须首先列出表名,然后使用from连接指定子句:

delete wineries
            from wineries join
            (select email, max(id) as maxid
             from wineries
             group by email
             having count(*) > 1
            ) we
            on we.email = wineries.email and
               wineries.id < we.maxid;

或者把它写成一个exists子句:

delete from wineries
    where exists (select 1
                  from (select email, max(id) as maxid
                        from wineries
                        group by email
                       ) we
                  where we.email = wineries.email and wineries.id < we.maxid
                 )
于 2013-07-12T15:31:05.480 回答
1
select email, max(id), COUNT(email) AS occurences
FROM wineries
GROUP BY email
HAVING (COUNT(email) > 1);
于 2013-07-12T15:28:53.027 回答
0
delete from wineries
where id not in
(
  select * from 
  ( 
     select min(id)
     from wineries
     group by email
  ) x
)

您需要一个子查询来欺骗 MySQL 从它同时选择的表中删除。

于 2013-07-12T15:28:27.223 回答
0
DELETE duplicates.*
FROM wineries
JOIN wineries AS duplicates USING (email)
WHERE duplicates.id < wineries.id;

在 sqlfiddle.com 上玩它

于 2013-07-12T17:16:48.257 回答
0

这是最简单的选项:

DELETE FROM wineries
 WHERE id NOT IN
(
  SELECT MIN(id) id
    FROM wineries
GROUP BY email 
);

这将只保留每个电子邮件地址的第一个插入记录,所有其他记录将被删除。这个答案的功劳应该归功于@juergen d,因为这只是他答案的修订版。

于 2019-04-05T15:27:06.547 回答