MySQL去重的方法整理
MySQL去重的方法整理
【初级】有极少的重复行
使用distinct查出来,然后手动一行一行删除。
【中级】按照单个字段的重复去重
例如:对id字段去重
使用方法:获取id的重复字段的值,利用相同id字段所在的行中,比较出数据不同的字段,删除除了最小(或最大)的字段所在的该行之外的所有重复的行。一般使用主键来比较,因为主键的值一定是唯一值,绝对不相同。
idname 1a 1b 2c 2a 3c
结果:
idname 1a 2a
操作:
deletefroma_tmp whereidin(select*from(selectb.idfroma_tmpbgroupbyb.idhavingcount(b.id)>1)bb) andnamenotin(select*from(selectmin(a.name)froma_tmpaGROUPBYa.idhavingcount(a.id)>1)aa);
注意:
上述加粗并绿色的字,必须加别名,必须使用select*from(……)这样的格式,否则会报错:
[Err]1093-Youcan'tspecifytargettable'a_tmp'forupdateinFROMclause
【高级】按多个字段的重复来去重
例如:对id,name相同的去重,即:对id,name都相同的算作重复行,对id相同而name不同的算作不重复行
使用方法:和单个字段相似,一般使用主键来比较,因为主键的值一定是唯一值。
idnamerowid 1a1 1a2 1b3 2b4 2b5 3c6 3d7
结果:
idnamerowid 1a1 1b3 2b4 3c6 3d7
操作:
第一种:
deletefroma_tmp where(id,name)in(select*from(selectb.id,b.namefroma_tmpbgroupbyb.id,b.namehavingcount(b.id)>1)bb) androwidnotin(select*from(selectmin(a.rowid)froma_tmpagroupbya.id,a.namehavingcount(a.id)>1)aa);
第二种:
将id和name字段的值连接起来插入到临时表中b_tmp,这样便可以使用【中级】的单字段的判断删除方法。
#将两字段连接的值,a_tmp表中唯一值的字段插入b_tmp表
insertintob_tmp selectconcat(id,name),rowidfroma_tmp; #查出需要留下来的行 selectid_name,max(rowid) fromb_tmp groupbyid_name havingcount(id_name)>1; #使用【中级】的方法,或存储过程完成去重的工作
【终极】每行都有两份一样的数据
例如:
使用方法:对于整行的数据都一样,是没办法使用SQL语句删除的,因为没有可以使用的条件限制来留下一行删除所有与其相同的行。没有不同的字段可以自己创造不同的字段,即:添加一个字段,设为自增长,并设为主键,它会自动添加上值。
idname 1a 1a 1b 1b 2c 2c 3c 3c
结果:
idnamerowid 1a1 1b3 2c5 3c7
操作:
添加一个自增长的字段,并暂时设为主键。
使用上面【中级】和【高级】的方法操作。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!