Před pár dny, když jsem dělal požadavek, jsem potřeboval vyčistit duplicitní záznamy v mysql, a tehdy bylo myšlenkou to napsat přes code traversal, a pak jsem si myslel, že je to příliš složité, protože jsem si myslel, že bych problém měl vyřešit SQL příkazem. Po ověření informací a konzultaci se šéfem jsem přišel s velmi pohodlným SQL příkazem, a zde se s ním podělím o SQL tvrzení a nápady.
Analýza potřeb
Pokud jsou v databázi duplicitní záznamy, jeden z nich smažte a ponechejte (ať už je kritériem pro určení duplicitních polí více polí)
řešení
Když tuto potřebu potkáte, pravděpodobně máte v srdci nějakou představu. Nejrychlejší věc, která mě napadla, byla, že bych to mohl vyřešit SQL příkazem, ale byl jsem příliš povrchní v složitých SQL příkazech, takže jsem chtěl požádat šéfa o pomoc.
Najděte někoho, kdo vám pomůže
因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给@赵七七同学,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...
Own Baidu
Našel jsem SQL příkaz:
Tento SQL nápad je jasný, existují následující 3 kroky:
- SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAS count(*) > 1 Dotazujte na duplicitní záznamy v tabulce jako podmínku
- SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Druhou podmínkou je nejmenší hodnota ID v duplicitních záznamech v tabulce dotazů
- Nakonec, podle výše uvedených dvou podmínek, smažte zbývající duplicitní záznamy kromě nejmenšího ID v duplicitním záznamu
Bohužel však při spuštění tohoto příkazu dochází k chybě, což zhruba znamená, že tabulka nemůže být aktualizována současně s dotazem.
Kód vyřešen
Na základě výše uvedeného SQL tvrzení si myslím, že můžete dosáhnout stejného cíle ve dvou krocích pomocí kódu:
- Nejprve se odstraní duplicitní datové sady
- Na základě dotazované datové sady jsou zbývající duplikáty odstraněny v cyklu
Měl jsem nápad a napsal jsem ho rychle, ale byl jsem šokovaný, když jsem ho pustil, a opravdu jsem ho potřeboval116svlevo a vpravo, a pak chci najít SQL příkaz, který mohu použít, vložit kód a běžící výsledek:
Perfektní [deduplikace a nechat jedno] SQL
Nakonec jsem dostal dokonalou odpověď v technické skupině, podívejte se na toto SQL tvrzení:
Výše uvedené tvrzení o sql, pokud se podíváte pozorně, není těžké pochopit myšlenku a pravděpodobně je rozděleno do 3 kroků, abyste to pochopili:
- (SELECT min(id) id, user_id, monetary consume_time FROM consum_record GROUP PODLE user_id, monetary, consume_time HAVING count(*) > 1 ) t2 Dotazujte duplicitní záznamy a vytvořte kolekci (dočasná tabulka t2), která obsahuje minimální 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 Přidružená pole pro duplicitní kritéria
- Mazat záznamy s ID většími než ID v T2 podle podmínek
Když jsem tu větu viděl, pomyslel jsem si, že je příliš silná. Tak jednoduché SQL příkaz dokáže vyřešit tak složitý problém a postoj se zvyšuje~ Je také velmi rychlý na provoz, původní spuštění kódové smyčky trvá asi 116 sekund, ale tady stačí 0,3 sekundy, úžasné~
|