作者个人研发在高并发场景下提供了一个简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。开源半年多以来,已成功为十几家中小企业提供精准定时调度解决方案,经受住了生产环境的考验。为了造福更多的童鞋,这里给出开源框架的地址:https://github.com/sunshinelyz/mykit-delay写的比较早,有朋友出去面试,面试官问了这样一个问题:如何查询和删除MySQL中的重复记录?对于这样的问题相信很多朋友都会一头雾水。那么,我们如何完美地回答这个问题呢?今天,我们就一起来探讨一下这道经典的MySQL面试题。问题分析题目中的问题有两种理解。第一个理解是把题目问题拆成两个问题,分别是:如何查询MySQL中的重复记录?如何删除MySQL中的重复记录?另一种理解是:如何查询和删除MySQL中的重复记录?没关系,不管我们怎么理解,今天都要搞定!!为了让小伙伴们更好的了解如何解决实际工作中遇到的类似问题。在这里,我不会简单地回答标题问题,而是在各种场景下使用SQL语句查询和删除MySQL数据库中的重复记录。问题解决查找重复记录1.查找所有重复记录select*fromtablewhereduplicatefieldin(selectduplicatefieldfromtablegroupbyduplicatefieldhavingcount(*)>1)2.过滤重复记录(只显示一条)select*fromHZTWhereIDIn(selectmax(ID)fromHZTgroupbyTitle)注:此处显示ID最大的记录。删除重复记录1.删除所有重复记录(慎用)deletetablewhereduplicatefieldin(selectduplicatefieldfromtablegroupbyduplicatefieldhavingcount(*)>1)2.保留一条(这应该是大多数人需要的^_^)deleteHZTwhereIDnotIn(selectmax(ID)fromHZTgroupbyTitle)注意:这里保留ID最大的一条记录。三、例1、查找表中多余的重复记录。重复记录判断根据单个字段(peopleId)字段(peopleId)来判断,只留下rowid最小的记录deletefrompeoplewherepeopleIdin(selectpeopleIdfrompeoplegroupbypeopleIdhavingcount(peopleId)>1)androwidnotin(selectmin(rowid)frompeoplegroupbypeopleIdhavingcount(peopleId)>1)3.查找表中冗余重复记录(多字段)select*fromvitaeawhere(a.peopleId,a.seq)in(selectpeopleId,seqfromvitaegroupbypeopleId,seqhavingcount(*)>1)4.删除冗余重复记录(多字段)in表,只留下rowid最小的记录deletefromvitaeawhere(a.peopleId,a.seq)in(selectpeopleId,seqfromvitaegroupbypeopleId,seqhavingcount(*)>1)androwidnotin(selectmin(rowid)fromvitaegroupbypeopleId,seqhavingcount(*)>1)5.查找表中多余的重复记录(多字段),Select*fromvitaewhere(a.peopleId,a.seq)in(selectpeopleId,seqfromvitaegroupbypeopleId,seqhavingcount(*)>1)androwidnotin(selectmin(rowid)fromvitaegroupbypeopleId,seqhavingcount(*)>1)不包含最小的rowid。两条以上的重复记录,一条完全重复重复记录,即所有字段重复的记录。第二种是关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或者可以忽略。1、对于第一种重复,比较容易解决,使用selectdistinct*fromtableName得到一个没有重复记录的结果集。如果表需要删除重复记录(保留1条重复记录),可以通过以下方法删除selectdistinct*into#TmpfromtableNamedroptableNameselect*intotableNamefrom#Tmpdroptable#Tmp。可以解决。2、这种重复问题通常需要在重复记录中保留第一条记录,操作方法如下。假设重复字段为Name和Address,要求获取这两个字段的唯一结果集selectidentity(int,1,1)asautoID,*into#TmpfromtableNameselectmin(autoID)asautoIDinto#Tmp2from#TmpgroupbyName,autoIDselect*from#tmpwhereautoIDin(selectautoIDfrom#tmp2)本文转载自微信公众号「冰河科技」,可通过以下二维码关注。转载本文请联系冰川科技公众号。
