För några dagar sedan, när jag gjorde ett krav, behövde jag rensa upp dubblettposter i MySQL, och tanken då var att skriva det genom kodgenomgång, men då tyckte jag att det var för komplicerat, och jag trodde att jag borde kunna lösa problemet med en SQL-sats. Efter att ha kontrollerat informationen och rådgjort med chefen kom jag på ett mycket bekvämt SQL-uttalande, och här kommer jag att dela med mig av detta SQL-uttalande och idéer.
Behovsanalys
Om det finns dubbletter i databasen, ta bort och behåll en av dem (oavsett om kriterierna för att avgöra dubblettfält är flera fält)
lösning
När du möter detta behov har du förmodligen en idé i hjärtat. Det snabbaste jag kom på var att jag kunde lösa det med en SQL-sats, men jag var för ytlig i komplexa SQL-satser, så jag ville be chefen om hjälp.
Hitta någon som kan hjälpa
因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给@赵七七同学,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...
Egen Baidu
Hittade ett SQL-uttryck:
Denna SQL-idé är uppenbar, det finns följande tre steg:
- SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAR räkning(*) > 1 Sök dubblettposter i tabellen som villkor
- SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAR räkning(*) > 1 Det andra villkoret är det minsta värdet av ID:t i de dubblettposter i frågetabellen
- Slutligen, enligt ovanstående två villkor, radera de återstående dubblettposterna förutom det minsta ID:t i den dubblettposten
Men tyvärr finns det ett fel vid körning av detta uttalande, vilket ungefär betyder att tabellen inte kan uppdateras samtidigt som frågan.
Kod löst
Baserat på ovanstående SQL-uttalande tror jag att du kan uppnå samma mål i två steg genom kod:
- Dubblettdataset tas ut först
- Baserat på den frågeställda datamängden tas de återstående dubbletten bort i en loop
Jag hade en idé och skrev den snabbt, men jag blev chockad när jag publicerade den, och jag behövde den faktiskt116:orvänster och höger, och sedan vill jag hitta en SQL-sats som jag kan använda, klistra in koden och det löpande resultatet:
Perfekt [deduplicering och lämna en] SQL
Till slut fick jag ett perfekt svar i en teknisk grupp, titta på detta SQL-uttalande:
Ovanstående SQL-sats, om du tittar noga, är det inte svårt att lista ut idén, och den är troligen uppdelad i tre steg för att förstå:
- (SELECT min(id) id, user_id, monetary, consume_time FROM consum_record GROUP BY user_id, monetary, consume_time HAVING count(*) > 1) t2 Sök i dubblettposterna för att bilda en samling (temporär tabell t2), som innehåller minsta ID för varje duplicerad post
- consum_record.user_id = t2.user_id och consum_record.monetary = t2.monetary och consum_record.consume_time = t2.consume_time Associerade fält för de dubblettkriterierna
- Radera poster med ID större än ID i T2 enligt villkoren
När jag såg den här meningen tänkte jag för mig själv att det var för kraftfullt. En så enkel SQL-sats kan lösa ett så komplext problem, och statusen ökar~ Det är också supersnabbt att köra, den ursprungliga kodloopexekveringen tar ungefär 116 sekunder, men här räcker 0,3 sekunder, fantastiskt~
|