Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 15984|Svar: 0

[Källa] MySQL [ta bort redundans och lämna en] En SQL-sats kompletterar idésammanfattningen

[Kopiera länk]
Publicerad på 2019-03-13 13:37:42 | | | |
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~







Föregående:javaEE oktober 2018 videomaterial
Nästa:SQL modifierar slumpmässigt den uppdaterade datan
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com