Pred pár dňami, keď som robil požiadavku, potreboval som vyčistiť duplicitné záznamy v mysql a vtedy som mal v pláne napísať to cez code traversal, a potom som si myslel, že je to príliš zložité, myslel som si, že problém by som mal vedieť vyriešiť SQL príkazom. Po overení informácií a konzultácii so šéfom som prišiel s veľmi pohodlným sql výrokom, a tu sa s ním podelím a predstavím.
Analýza potrieb
Ak sú v databáze duplicitné záznamy, jeden z nich vymažte a ponechajte (či už kritériom na určenie duplicitných polí je viacero polí)
riešenie
Keď narazíte na túto potrebu, pravdepodobne máte v srdci nejakú predstavu. Najrýchlejšie, čo mi napadlo, bolo, že to vyriešim pomocou SQL príkazu, ale bol som príliš povrchný v zložitých SQL príkazoch, takže som chcel požiadať šéfa o pomoc.
Nájdi niekoho, kto ti pomôže
因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给@赵七七同学,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...
Own Baidu
Našiel som SQL príkaz:
Táto myšlienka SQL je zrejmá, existujú nasledujúce 3 kroky:
- SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Vyžiadajte duplicitné záznamy v tabuľke ako podmienku
- SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Druhou podmienkou je najmenšia hodnota ID v duplicitných záznamoch v tabuľke dotazov
- Nakoniec, podľa vyššie uvedených dvoch podmienok, vymažte zostávajúce duplicitné záznamy okrem najmenšieho ID v duplicitnom zázname
Bohužiaľ, pri spustení tohto príkazu je chyba, čo približne znamená, že tabuľka sa nedá aktualizovať súčasne s dotazom.
Kód vyriešený
Na základe vyššie uvedeného SQL vyjadrenia si myslím, že by ste mohli dosiahnuť rovnaký cieľ v dvoch krokoch cez kód:
- Duplicitné dátové súbory sa vyberú ako prvé
- Na základe dotazovaného datasetu sa zostávajúce duplikáty odstraňujú v slučke
Mal som nápad a rýchlo som ho napísal, ale bol som šokovaný, keď som ho spustil, a naozaj som ho potreboval116sľavo a doprava, a potom chcem nájsť SQL príkaz, ktorý môžem použiť, vložiť kód a bežiaci výsledok:
Perfektné [deduplikácia a ponechať jedno] SQL
Nakoniec som dostal dokonalú odpoveď v technickej skupine, pozrite sa na toto SQL vyhlásenie:
Vyššie uvedené SQL tvrdenie, ak sa pozriete pozorne, nie je ťažké pochopiť myšlienku a pravdepodobne je rozdelené do 3 krokov na pochopenie:
- (SELECT min(id) id, user_id, monetary, consume_time FROM consum_record GROUP PODĽA user_id, monetary, consume_time HAVING count(*) > 1 ) t2 Vyžiadajte duplicitné záznamy na vytvorenie kolekcie (dočasná tabuľka t2), ktorá obsahuje minimálne ID každého duplicitného záznamu
- consum_record.user_id = t2.user_id a consum_record.monetary = t2.monetary a consum_record.consume_time = t2.consume_time Asociované polia pre duplicitné kritériá
- Vymažte záznamy s ID väčšími ako ID v T2 podľa podmienok
Keď som videl túto vetu, pomyslel som si, že je príliš silná. Takýto jednoduchý SQL príkaz dokáže vyriešiť taký zložitý problém a postoj tela rastie~ Je tiež veľmi rýchly na spustenie, pôvodné vykonávanie kódovej slučky trvá asi 116 sekúnd, ale tu stačí 0,3 sekundy, úžasné~
|