`
fantaxy025025
  • 浏览: 1247398 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

MySQL_用一条SQL语句删除重复记录

 
阅读更多

 

MySQL 一条SQL语句删除重复记录

 

不正确的写法一。

delete from t_user where id in(select max(id) as id from t_user group by username ); 

但是mysql不支持这个写法(别的db是不是支持,没有测试),报错:

ERROR 1093 (HY000): You can't specify target table 't_user' for update in FROM clause

原因大概是删除的同时,不能查询自己,跟程序的foreach循环过程中不能删除类似

 

不正确的写法二。

delete t_user

from t_user as t_user, (select id from t_user group by username having count(*) > 1) as t2

where t_user.id=t2.id; 

这个的原理是删除重复的,但这个算法只对重复个数是2的管用,一旦重复数是3等,就不能惯用了。

 

 

正确的方法一。

--这个算法的原理是:group但不会count,这样在temp_table中的就是最终要留下来的结果,把其他的删除就ok了

--另外,这里利用了temp table,避免了上面foreach不能删除的问题

delete t_user

from t_user  

where id not in (

    select id from (select id from t_user group by username) as temp_table

);

 

正确的方法二。

算法同上,只是可以不用group,用distinct

 

例子:

--表

 

drop table t_user; 

create table t_user( 

id        int(5) not null auto_increment, 

username varchar(10), 

age       int(3), 

primary key(id) 

); 

 

--插入

insert into t_user(username,age) values('aaa',20); 

insert into t_user(username,age) values('aaa',20);

 

insert into t_user(username,age) values('bbb',20); 

insert into t_user(username,age) values('bbb',20); 

insert into t_user(username,age) values('bbb',20); 

 

insert into t_user(username,age) values('ccc',20); 

insert into t_user(username,age) values('ccc',20); 

insert into t_user(username,age) values('ccc',20); 

insert into t_user(username,age) values('ccc',20); 

insert into t_user(username,age) values('e',10); 

insert into t_user(username,age) values('f',5); 


--查看
mysql> select * from t_user;
+----+----------+------+
| id | username | age  |
+----+----------+------+
| 55 | aaa      |   20 |
| 56 | aaa      |   20 |
| 57 | bbb      |   20 |
| 58 | bbb      |   20 |
| 59 | bbb      |   20 |
| 60 | ccc      |   20 |
| 61 | ccc      |   20 |
| 62 | ccc      |   20 |
| 63 | ccc      |   20 |
| 64 | e        |   10 |
| 65 | f        |    5 |
+----+----------+------+
11 rows in set (0.00 sec)

 

--删除

 

delete t_user

from t_user  

where id not in (

    select id from (select id from t_user group by username) as temp_table

);

--再查看

 

mysql> select * from t_user;

+----+----------+------+

| id | username | age  |

+----+----------+------+

| 55 | aaa      |   20 |

| 57 | bbb      |   20 |

| 60 | ccc      |   20 |

| 64 | e        |   10 |

| 65 | f        |    5 |

+----+----------+------+

5 rows in set (0.00 sec)


 

 

--------END EOF 完毕-------

O

K

 

O

K

O

K


 

分享到:
评论

相关推荐

    【MySQL数据库】一条SQL语句为什么执行这么慢?

    面试高频题目,一条SQL语句为什么执行这么慢? 这其中涉及的知识也是各种各样,今天就让我们来完全剖析这个问题。 一条SQL语句为什么执行这么慢?一、执行偶尔变慢1. 刷脏页,写磁盘2. 还在等锁3. 回滚日志过多二、...

    MySQL根据某一个或者多个字段查找重复数据的sql语句

    sql 查出一张表中重复的所有记录数据 1.表中有id和name 两个字段,查询出name重复的所有数据 select * from xi a where (a.username) in (select username from xi group by username having count(*) > 1) 2、...

    MySQL – binlog日志简介及设置

    mysql-binlog介绍   mysql-binlog是MySQL数据库的二进制日志,用于记录用户对数据库操作的SQL语句((除了数据查询语句)信息。可以使用mysqlbin命令查看...优点:不需要记录每一条SQL语句与每行的数据变化,这样子bi

    Python语句实现Mysql多条插入语句

    本代码,用python语句,实现了一次插入多条sql语句。希望能对大家带来帮助。

    Mysql查询最近一条记录的sql语句(优化篇)

    主要介绍了Mysql查询最近一条记录的sql语句,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧

    一条sql语句在mysql中是如何执行的.docx

    一条sql语句在mysql中是如何执行的.docx

    mysql 一条语句删除多表数据

    平时工作中可以用到的,将关联的表中的数据,用一条语句删除,节省数据库链接资源

    一条sql语句完成MySQL去重留一

    最快想到的是可以通过一条sql语句来解决,无奈自己对于复杂sql语句的道行太浅,所以想找大佬帮忙。 找人帮忙 因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给同事,结果这...

    mysql中获取一天、一周、一月时间数据的各种sql语句写法

    今天抽时间整理了一篇mysql中与天、周、月有关的时间数据的sql语句的各种写法,部分是收集资料,全部手工整理,自己学习的同时,分享给大家,并首先默认创建一个表、插入2条数据,便于部分数据的测试,其中部分名词...

    DBHelper数据库操作类(支持OleDb、MySQL、Oracle、SQL、SQLite).zip

    执行多条SQL语句,实现数据库事务。 执行带一个存储过程参数的的SQL语句。 向数据库里插入图像格式的字段 执行一条计算查询结果语句,返回查询结果 执行查询语句,返回MySqlDataReader 执行查询语句,返回DataSet ...

    详解一条sql语句在mysql中是如何执行的

    最近开始在学习mysql相关知识,自己根据学到的知识点,根据自己的理解整理分享出来,本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的。...

    mysql 经典sql语句

    一条经典的SQL语句能优化整个系统的运行,本文详细记录了双轨制系统的所有SQL

    sql常用语句

    多条sql语句需要用 分号(;)分隔,单条可以不加,但为了不出现错误,一般都加上,使用mysql命令行必须加分号来结束。另外sql语句可以写在一行,但为了方便阅读与调试,一般会将sql语句分成多行来写

    常用SQL 语句大全

    13、一条sql 语句搞定数据库分页 14、前10条记录 15、选择每组中的最大数 第三部分、 技巧 1、True/False的使用 2、收缩数据库 3、压缩数据库 dbcc shrinkdatabase(dbname) 4、转移数据库给新用户以已存在...

    经典全面的SQL语句大全

     13、说明:一条sql 语句搞定数据库分页 select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段  14、说明:...

    OAmbre#Java-Interview#MySQL是如何执行一条SQL语句的1

    Server层按顺序执行sql的步骤为:客户端请求->连接器(验证用户身份,给予权限) -> 查询缓存(存在缓存则直接返回,不存在则执行后续操作)->分析器(对

    SQL语句执行深入讲解(MySQL架构总览-查询执行流程-SQL解析顺序)

    一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了。 本文将从MySQL总体架构—>查询执行流程—>语句执行顺序来探讨一下其中的知识。 一、MySQL架构总...

    一个项目涉及到的50个Sql语句(整理版)

    一个项目涉及到的50个Sql语句(整理版) 一个项目涉及到的50个Sql语句(整理版) 一个项目涉及到的50个Sql语句(整理版) 一个项目涉及到的50个Sql语句(整理版)

    MYSQL常用命令大全

    例如,往表 MyClass中插入二条记录, 这二条记录表示:编号为1的名为Tom的成绩为96.45, 编号为2 的名为Joan 的成绩为82.99,编号为3 的名为Wang 的成绩为96.5. mysql> insert into MyClass values(1,'Tom',96.45),(2,...

Global site tag (gtag.js) - Google Analytics