MySQL 删除 with where 不会报错

标签 mysql sql

我有一个这样的表:

create table person (
  id integer,
  Email varchar(100)
);


insert into person values (1, 'john@example.com');
insert into person values (2, 'bob@example.com');
insert into person values (3, 'john@example.com');
insert into person values (4, 'john@example.com');

现在,我需要删除重复行并保留最小 Id,这意味着删除后表将是:

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+

我得到这个是为了获取一个不重复的 id 列表:

select Id from Person group by Email;

删除代码是:

delete from Person
  where Person.Id not in 
    (select Id from Person group by Email);

但对我来说不起作用,为什么我不能这样写以及如何解决它?

最佳答案

您可以使用 JOIN as 轻松完成

delete p from person p 
join ( 
  select min(id) as id ,email from person group by email 
)p1 
on p1.id < p.id and p1.Email = p.Email ;

关于MySQL 删除 with where 不会报错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29540100/

相关文章:

mysql - Symfony2 在 Doctrine Fixtures Load 中执行 SQL 文件

sql - Spark 窗口函数 - rangeBetween 日期

MySql order by 与今天的日期相关

MySQL 存储过程并且仅在特定条件下更新

php - 如何使用php创建多个依赖的下拉列表并将数据保存在mysql数据库中?

php - 通过 PHP 访问连接到 MySQL 数据库被拒绝

mysql - 如果所有记录都被删除,如何在 Rails 应用程序中重置 mysql 中的主键

python - Sqlalchemy 在查询过程中失去连接

mysql - 在一个查询中将串联字符串格式化为日期格式

php - 如何防止 PHP 中的 SQL 注入(inject)?