Een paar dagen geleden, toen ik een vereiste deed, moest ik de dubbele records in MySQL opschonen, en het idee was toen om het via codedoorloop te schrijven, maar toen vond ik het te ingewikkeld, omdat ik dacht dat ik het probleem met een SQL-instructie zou kunnen oplossen. Na het controleren van de informatie en overleg met de baas, kwam ik op een zeer handige SQL-instructie, en hier zal ik deze SQL-verklaring en ideeën delen.
Behoefteanalyse
Als er dubbele records in de database staan, verwijder en bewaar er één (ongeacht of de criteria voor het bepalen van dubbele velden meerdere velden zijn)
oplossing
Wanneer je deze behoefte tegenkomt, heb je waarschijnlijk een idee in je hart. Het snelste wat ik bedacht had, was dat ik het kon oplossen met een SQL-instructie, maar ik was te oppervlakkig in complexe SQL-instructies, dus wilde ik de baas om hulp vragen.
Zoek iemand om te helpen
因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给@赵七七同学,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...
Eigen Baidu
Ik vond een SQL-instructie:
Dit SQL-idee is duidelijk, er zijn de volgende 3 stappen:
- SELECTEER peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Zoek duplicaatrecords in de tabel op als voorwaarde
- SELECTEER min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 De tweede voorwaarde is de kleinste waarde van de ID in de dubbele records in de querytabel
- Verwijder tenslotte volgens bovenstaande twee voorwaarden de resterende dubbele records behalve de kleinste ID in de dubbele record.
Maar helaas is er een fout bij het uitvoeren van deze instructie, wat ruwweg betekent dat de tabel niet tegelijk met de query kan worden bijgewerkt.
Code opgelost
Op basis van bovenstaande SQL-verklaring denk ik dat je hetzelfde doel in twee stappen via code kunt bereiken:
- Dubbele datasets worden eerst verwijderd
- Op basis van de geraadpleegde dataset worden de overgebleven duplicaten in een lus verwijderd
Ik had een idee en schreef het snel, maar ik was geschokt toen ik het publiceerde, en ik had het echt nodig116'slinks en rechts, en dan wil ik een SQL-instructie vinden die ik kan gebruiken, de code en het lopende resultaat plakken:
Perfecte [deduplicatie en laat er één achter] SQL
Uiteindelijk kreeg ik een perfect antwoord in een technische groep, kijk naar deze SQL-uitspraak:
De bovenstaande SQL-uitspraak, als je goed kijkt, is niet moeilijk om het idee te begrijpen, en het is waarschijnlijk verdeeld in 3 stappen om te begrijpen:
- (SELECT min(id) id, user_id, monetary, consume_time FROM consum_record GROUP BY user_id, monetary, consume_time HAVING count(*) > 1 ) t2 Zoek de dubbele records op om een collectie te vormen (tijdelijke tabel t2), die de minimale ID van elk duplicaat record bevat
- consum_record.user_id = t2.user_id en consum_record.monetary = t2.monetary en consum_record.consume_time = t2.consume_time Associate-velden voor de dubbele criteria
- Verwijder records met ID's groter dan IDs in T2 volgens de voorwaarden
Toen ik deze zin zag, dacht ik bij mezelf dat dit te krachtig was. Zo'n eenvoudige SQL-instructie kan zo'n complex probleem oplossen, en de positie stijgt~ Het is ook supersnel om te draaien, de originele codeloop duurt ongeveer 116 seconden, maar hier is 0,3 seconden genoeg, geweldig~
|