• mysql中删除重复记录,只保留一条


    表结构如下:

    mysql> desc test1;
    +--------------+------------------+------+-----+---------+----------------+
    | Field        | Type             | Null | Key | Default | Extra          |
    +--------------+------------------+------+-----+---------+----------------+
    | ID           | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | SENDERNAME   | varchar(32)      | YES  |     | NULL    |                |
    | RECEIVERNAME | varchar(64)      | YES  |     | NULL    |                |
    | SENDER       | varchar(64)      | NO   |     | NULL    |                |
    | RECEIVER     | varchar(64)      | NO   |     | NULL    |                |
    | SUBJECT      | varchar(512)     | NO   |     | NULL    |                |
    | CONTENT      | text             | NO   |     | NULL    |                |
    | PRIORITY     | int(11)          | NO   | MUL | NULL    |                |
    | STATUS       | int(11)          | NO   | MUL | NULL    |                |
    | CREATETIME   | datetime         | NO   |     | NULL    |                |
    | SENDTIME     | datetime         | YES  |     | NULL    |                |
    +--------------+------------------+------+-----+---------+----------------+
    
    

    subject和RECEIVER   需要做uniq key,但设计时未做,后面的数据就有很多重复的记录。

    1. 查询需要删除的记录,会保留一条记录。
    select a.id,a.subject,a.RECEIVER from test1 a left join (select c.subject,c.RECEIVER ,max(c.id) as  bid from test1 c where status=0 GROUP BY RECEIVER,SUBJECT having count(1) >1) b on a.id< b.bid where  a.subject=b.subject and a.RECEIVER = b.RECEIVER and a.id < b.bid

    2. 删除重复记录,只保留一条记录。注意,subject,RECEIVER 要索引,否则会很慢的。
    delete a from test1 a, (select c.subject,c.RECEIVER ,max(c.id) as  bid from test1 c where status=0 GROUP BY RECEIVER,SUBJECT having count(1) >1) b where a.subject=b.subject and a.RECEIVER = b.RECEIVER and a.id < b.bid;

    一个比较巧的方法 from http://www.php18.com/archives/Mysql_3012.html

    Mysql删除重复的记录(只保留一条)

    原理很简单:
    把不重复的记录复制到一个新table,  之后删除旧table, 再把新table改回旧table的名不就行了?

    create table new_table_name  select *, count(distinct title_name) from old_table_name  group by title_name

    new_table_name就是新表名

    old_table_name 为原表名

    title_name 就是不想重复的字段

    注意:这个方法创建的新表后面会多一个字段,删除即可

    转自:http://petermis.blog.51cto.com/2336802/1187044

  • 相关阅读:
    【转载】JavaScript变量: 变量命名原则
    【转载】mysql运行报【The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone...】的解决方法
    Java Web 环境搭建
    原生JS消息提示插件Message.js
    SQL Server 参数嗅探问题
    根据表名和列名获取关联index的创建脚本
    mongodb快速均衡导入数据
    index optimize
    PG Foreign key 外键
    无密码登陆
  • 原文地址:https://www.cnblogs.com/lhcxinmiren/p/6495116.html
Copyright © 2020-2023  润新知