原文在我自己的博客里,小伙伴们也可以点击阅读原文跳转查看,还有好听的背景音乐~我前几天在做一个需要的时候,需要清理mysql中的重复记录。当时的想法是通过代码遍历写出来,后来觉得太复杂了,认为应该通过一条sql语句来解决问题。查了资料,请教了大佬们,想出了一个非常方便的sql语句。这里我就分享一下这个sql语句和思路。需求分析数据库中有重复的记录,删掉保留其中一条(判断是否重复的标准是多个字段)解决方案遇到这个需求的时候,心里大概有个想法。最快想到的就是一条sql语句就可以解决,但是我对复杂的sql语句了解太少,所以想请教大佬们帮忙。因为这个需要找人帮忙有点着急,所以我第一个想到的就是可以找这个领域的同事来解决,然后把这个问题分享给@赵巧白同学。结果这家伙随便google了一下就给了我。没用过的sql语句,自己试试吧,心急如焚。。。在百度上找到一条sql语句:DELETEFROMvitaeaWHERE(a.peopleId,a.seq)IN(SELECTpeopleId,seqFROMvitaeGROUPBYpeopleId,seqHAVINGcount(*)>1)ANDrowidNOTIN(SELECTmin(rowid)FROMvitaeGROUPBYpeopleId,seqHAVINGcount(*)>1)这条语句在【MySQL只保留一条重复数据】中被删除发现在本文中。这条sql思路很明显,有以下3步:SELECTpeopleId,seqFROMvitaeGROUPBYpeopleId,seqHAVINGcount(*)>1查询出表中的重复记录作为条件SELECTmin(rowid)FROMvitaeGROUPBYpeopleId,seqHAVINGcount(*)>1查询表中重复记录中最小ID的值作为第二个条件最后根据以上两个条件,删除重复记录中除最小ID外的剩余重复记录但不幸的是,运行这条语句时出现了错误,错误一般是指无法在查询的同时更新表。代码解决方案根据上面的sql语句,通过代码或许可以分两步达到同样的目的:先取出重复数据集,根据查询到的数据集,循环删除剩余的重复数据。速度很快,但是运行的时候惊呆了,大概用了116s,然后心想一定要找到可以用的sql语句,粘贴代码和运行结果:完美【去重留一】]SQL终于在一个技术组中我在这个sql语句中得到了完美的答案:DELETEconsume_recordFROMconsume_record,(SELECTmin(id)id,user_id,monetary,consume_timeFROMconsume_recordGROUPBYuser_id,monetary,consume_timeHAVINGcount(*)>1)t2WHERE消费记录。user_id=t2.user_idandconsume_record.monetary=t2.monetaryandconsume_record.consume_time=t2.consume_timeANDconsume_record.id>t2.id;仔细看上面的sql语句,不难揣摩思路,大概分3步来理解:HAVINGcount(*)>1)t2查询重复记录组成一个集合(临时表t2),集合这里是每条重复记录的最小IDconsum_record.user_id=t2.user_idandconsum_record.monetary=t2.monetaryandconsum_record.consume_time=t2.consume_time关联判断duplicatebenchmark的字段根据条件删除原表中id大于t2中id的记录看到这个语句的时候觉得太厉害了。这么简单的SQL语句就能解决这么复杂的问题,我长了个姿势~跑起来超级快。原先的代码循环执行大概需要116s,但是这里是0.3s,太神奇了~综上所述,作为一个php程序员,按理说这里的sql是憋不住的,但是在实践中,有需要忙的事情太多,目前的SQL水平也只是普通水平。以后找机会的时候一定要补充这些知识。资源为了方便小伙伴测试,特上传了这张数据表。如果有mysql工具,导入即可。今天就在这里分享consume_record.sql。
