几天前,当我提出要求时,我需要清理MySQL中的重复记录。当时,这个想法是通过代码遍历编写的,然后我觉得它太复杂了。我想我应该通过SQL语句解决一个问题。检查信息,让大个子得到一个非常方便的SQL语句,在这里分享这一部分的SQL语句和想法。

需求分析

数据库中有一个重复记录,其中一个的保留被保留。

解决方案

说到这个需求,头脑可能在思考,最快的是可以用SQL语句解决,但对于复杂的SQL语句,它们的语句太浅了,所以我想找到大帮助。

请求帮助

因为这需要有点着急,所以开始想一想,可以找到这个同行来解决这个问题,然后分享给同事,把货送到百度,你给我一个从未用过的SQL语句,让我试试,心10000那奔腾什么…

自己的百度

找到一个SQL语句:


删除
从
学历
哪里
(a.peopleid,a.seq(中)
选择
只,
序列
从
简历
组
只,
序列
有
计数(*)> 1
)
和ROWID不(
选择
min(rowid)
从
简历
组
只,
序列
有
计数(*)> 1
)



这个语句在MySQL中只有一个重复数据的文章中找到。这个SQL思想非常明显,有以下3个步骤:

只从简历的选择,只组测序,序列具有计数(*)> 1查询重复记录表中作为条件

选择min(rowid)表组只,序列具有计数(*)> 1查询出表,ID最小值是第二条件

最后,根据上述两个条件删除重复记录中的最小id的剩余重复记录。

但是,在错误地运行这个语句是非常无助的,在查询时更新表通常是错误的。

编码方案

根据上面的SQL语句,可能在两个步骤中实现相同的目标,可能是通过代码的方式实现的:

首先取出一组重复的数据。

从收集的数据集中删除其余的数据

这个想法是存在的,而且写得很快,但一旦操作使我害怕,它需要116s左右,然后我想找到SQL语句可以使用粘贴的代码和运行结果。





完美的SQL

最后,我们在一组技术中得到了完美的答案,并查看SQL语句:


删除consum_record
从
consum_record,
(
选择
分钟(id)id,
user_id,
货币的,
consume_time
从
consum_record
组
user_id,
货币的,
consume_time
有
计数(*)> 1
T2)
哪里
consum_record.user_id = t2.user_id
和consum_record.monetary = t2.monetary
和consum_record.consume_time = t2.consume_time
和consum_record.id > t2.id;



上面的sql语句,仔细看看,想出来的想法并不难,大概也分为3个步骤来理解:

(选择min(ID)的身份,user_id,货币,从consum_record组,1,货币consume_time,查询形成一套的重复记录(临时表),每个重复记录的最小的部分。

consum_record.user_id = t2.user_id和consum_record.monetary = t2.monetary和consum_record.consume_time = t2.consume_time协会决定重复数据领域。

根据条件,删除原始表中id大于T2中id的记录。

当你看到这个语句时,我认为它太多了,所以一个简单的SQL语句可以解决如此复杂的问题并摆出一个姿势。

它跑的超级快,周期的原代码被执行,它需要116s,这里0.3s是好的。



总结

作为一个PHP程序猿,SQL不能被合理地拖到后面,但实际上它需要太多繁忙的东西。现在SQL级别只有普通级别。在那之后,我们必须弥补这方面的知识。

今天在这里。