Néhány nappal ezelőtt, amikor egy követelményt csináltam, ki kellett takarítanom a duplikált rekordokat a mysql-ben, és akkoriban az volt az ötlet, hogy kód áthaladáson keresztül írjam ki, aztán túl bonyolultnak találtam, hogy a problémát egy SQL utasítással meg kellene oldani. Miután megnéztem az információkat és konzultáltam a főnökkel, kitaláltam egy nagyon kényelmes SQL-nyilatkozatot, és itt osztom meg ezt a SQL kijelentést és ötleteket.
Szükségletelemzés
Ha az adatbázisban vannak duplikált rekordok, töröld és tartsd meg az egyiket (függetlenül attól, hogy a duplikált mezők meghatározásának kritériuma több mező legyen).
megoldás
Amikor ezzel a szükséglettel szembesülsz, valószínűleg van egy ötleted a szívedben. A leggyorsabb dolog, ami eszembe jutott, az volt, hogy meg tudom oldani egy SQL utasítással, de túl sekély voltam a bonyolult SQL utasításokban, ezért a főnökötől akartam segítséget kérni.
Keress valakit, aki segíthet
因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给@赵七七同学,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...
Saját Baidu
Találtam egy SQL nyilatkozatot:
Ez az SQL ötlet nyilvánvaló, a következő három lépés van:
- SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Kérdezz duplikált rekordokat a táblában feltételként
- SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 A második feltétel az ID legkisebb értéke a lekérdezési táblában található duplikált rekordokban
- Végül, a fenti két feltétel szerint töröljük a megmaradt duplikált rekordokat, kivéve a duplikált rekord legkisebb azonosítóját
Sajnos azonban hiba van a futtatáskor ebben a mondatban, ami nagyjából azt jelenti, hogy a táblázatot nem lehet frissíteni egyszerre a lekérdezéssel.
Kód megoldva
A fenti SQL állítás alapján úgy gondolom, hogy két lépésben is elérheted ugyanazt a célt a kód segítségével:
- Először a duplikált adathalmazokat távolítják ki
- A lekérdezés alapján a megmaradt duplikátumokat egy hurokban eltávolítják
Volt egy ötletem, gyorsan megírtam, de megdöbbentett, amikor lefuttattam, és tényleg szükségem volt rá116-osokbal és jobbra, majd keresek egy SQL utasítást, amit használhatok, beillesztve a kódot és a futó eredményt:
Tökéletes [deduplikálás és hagyj egyet] SQL
Végül egy technikai csoportban tökéletes választ kaptam, nézd meg ezt a SQL állítást:
A fenti SQL állítást, ha alaposan megnézzük, nem nehéz megérteni az ötletet, és valószínűleg három lépésre van osztva, hogy megértsük:
- (SELECT min(id) id, user_id, monetary, consume_time FROM consum_record GROUP BY user_id, monetary, consume_time HAVING count(*) > 1) t2 Kérdezd le a duplikált rekordokat, hogy gyűjteményt alkossanak (ideiglenes t2 táblázat), amely tartalmazza minden duplikált rekord minimális azonosítóját
- consum_record.user_id = t2.user_id és consum_record.monetary = t2.monetary és consum_record.consume_time = t2.consume_time Társított mezők a duplikált kritériumokhoz
- Töröld a T2-ben nagyobb azonosítóval rendelkező rekordokat a feltételek szerint
Amikor megláttam ezt a mondatot, azt gondoltam magamban, hogy ez túl erős. Egy ilyen egyszerű sql állítás képes megoldani egy ilyen összetett problémát, és a testtartás emelkedik~ Ráadásul nagyon gyors futtatni, az eredeti kódciklus végrehajtása körülbelül 116 másodpercet vesz igénybe, de itt a 0,3 másodperc elég, lenyűgöző~
|