For noen dager siden, da jeg jobbet med et krav, måtte jeg rydde opp i duplikatpostene i MySQL, og ideen da var å skrive det gjennom kodetraversering, og så syntes jeg det var for komplisert, og tenkte at jeg burde kunne løse problemet med en SQL-setning. Etter å ha sjekket informasjonen og rådført meg med sjefen, kom jeg opp med en veldig praktisk SQL-setning, og her vil jeg dele denne SQL-setningen og ideene.
Behovsanalyse
Hvis det finnes dupliserte poster i databasen, slett og behold én av dem (enten kriteriene for å avgjøre dupliserte felt er flere felt)
løsning
Når du møter dette behovet, har du sannsynligvis en idé i hjertet. Det raskeste jeg tenkte på var at jeg kunne løse det med en SQL-setning, men jeg var for overfladisk på komplekse SQL-setninger, så jeg ville spørre sjefen om hjelp.
Finn noen som kan hjelpe
因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给@赵七七同学,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...
Egen Baidu
Fant en SQL-setning:
Denne SQL-ideen er åpenbar, det er følgende 3 steg:
- VELG peopleId, seq FRA vitae GROUP BY peopleId, seq HAR telling(*) > 1 Søk i duplikatposter i tabellen som en betingelse
- VELG min(rowid) FRA vitae GROUP BY peopleId, seq HAR telle(*) > 1 Den andre betingelsen er den minste verdien av ID-en i de dupliserte postene i spørringstabellen
- Til slutt, i henhold til de to ovennevnte betingelsene, slett de gjenværende duplikatpostene unntatt den minste ID-en i duplikatposten
Men dessverre oppstår det en feil i å kjøre denne setningen, noe som omtrent betyr at tabellen ikke kan oppdateres samtidig som spørringen.
Kode løst
Basert på SQL-setningen ovenfor tror jeg at du kan oppnå det samme målet i to steg gjennom kode:
- Dupliserte datasett fjernes først
- Basert på det forespurte datasettet fjernes de gjenværende duplikatene i en løkke
Jeg hadde en idé, og jeg skrev den raskt, men jeg ble sjokkert da jeg publiserte den, og jeg trengte den faktisk116-erevenstre og høyre, og så vil jeg finne en SQL-setning jeg kan bruke, lime inn koden og det løpende resultatet:
Perfekt [deduplisering og la en] SQL
Til slutt fikk jeg et perfekt svar i en teknisk gruppe, se på denne SQL-setningen:
Ovenstående SQL-setning, hvis du ser nøye etter, er det ikke vanskelig å finne ut av ideen, og den er sannsynligvis delt inn i 3 steg for å forstå:
- (SELECT min(id) id, user_id, monetary, consume_time FROM consum_record GROUP BY user_id, monetary, consume_time HAVING count(*) > 1 ) t2 Spør de dupliserte postene for å danne en samling (midlertidig tabell t2), som inneholder minimums-ID for hver duplikatpost
- consum_record.user_id = t2.user_id og consum_record.monetary = t2.monetary og consum_record.consume_time = t2.consume_time Assosierte felt for duplikatkriteriene
- Slett poster med ID-er større enn ID-er i T2 i henhold til betingelsene
Da jeg så denne setningen, tenkte jeg for meg selv at den var for kraftfull. En så enkel SQL-setning kan løse et så komplekst problem, og holdningen øker~ Det er også superraskt å kjøre, den opprinnelige kodeloop-kjøringen tar omtrent 116 sekunder, men her er 0,3 sekunder nok, fantastisk~
|