Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 15984|Válasz: 0

[Forrás] MySQL [távolítsd el a redundanciát és hagyj egyet] Egy sql utasítás egészíti ki az ötlet összefoglalóját

[Linket másol]
Közzétéve 2019. 03. 13. 13:37:42 | | | |
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ő~







Előző:javaEE 2018 októberi videóanyag
Következő:Az SQL véletlenszerűen módosítja a frissített adatokat
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com