mysql中删除一个表中的重复记录并只保留一条

爬虫爬数据的时候,有些记录会重复地插入数据库,如果直接用这些数据做实验,容易对实验结果造成影响,所以必要的时候,需要先清洗数据:把重复记录删除掉只保留一条。我们可以在实验过程中清洗数据,也可以直接在数据库中删除重复的数据。

  • 先从数据库中读取,在实验过程中去重。这样做无法解决根本问题,每次运行实验代码都要去重一次;
  • 用sql语句实现。重点是写出高效率的且不违反mysql要求(mysql不允许边查找边进行删除操作)的删除语句。

用sql语句实现去重,可以分步进行:

  1. 首先查出重复记录,形成一个临时表,临时表里面存储每对重复记录中最小的那个id;
  2. 其次用原数据表和临时表进行字段关联;
  3. 删除原数据表中id大于临时表中id的记录。

用一个示例说明:

建立一张数据表department,有三列:depId,depName,depLeader。其中depId自增,声明如果depName和depLeader都一样就说明这两行重复。表中目前的记录如下,可以看出2和4重复,3和5重复。

mysql中删除一个表中的重复记录并只保留一条_第1张图片

  1. 首先查出重复记录,sql语句:select min(depId) depId,depName,depLeader from department group by depName,depLeader having count(*)>1;
  2. 关联depName和depLeader字段,然后删除重复记录,sql语句:delete department from department ,(select min(depId) depId,depName,depLeader from department group by depName,depLeader having count(*)>1) temp where department.depName=temp.depName and department.depLeader=temp.depLeader and department.depId>temp.depId;
  3. 现在刷新刚才的表,可以看到重复记录已经被删除

现在来简要说明一下sql语句中每部分的作用。

mysql中删除一个表中的重复记录并只保留一条_第2张图片

  1. 第1个,普通的删除行的语法是delete from table......,这里在delete后面加了要删除的数据表名,因为多表联合删除的时候,我们需要指明要删除的数据表是哪个;
  2. 第2个,这部分就是查询出重复的记录,作为临时表temp;
  3. 第3个,数据的关联条件,最后一行是关键,它就是用来指明要删除原数据表中depId大于临时表depId的记录。

参考:https://www.jb51.net/article/129656.htm

你可能感兴趣的:(sql,删除重复记录,去重,清洗数据,数据库)