Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 15984|Atsakyti: 0

[Šaltinis] MySQL [pašalinti perteklių ir palikti vieną] SQL sakinys užbaigia idėjos santrauką

[Kopijuoti nuorodą]
Paskelbta 2019-03-13 13:37:42 | | | |
Prieš kelias dienas, kai aš darau reikalavimą, man reikėjo išvalyti pasikartojančius įrašus mysql, ir idėja tuo metu buvo parašyti jį per kodą pereiti, ir tada aš maniau, kad tai buvo per sudėtinga, manau, kad aš turėčiau sugebėti išspręsti problemą su sql pareiškimas. Patikrinęs informaciją ir pasikonsultavęs su viršininku, sugalvojau labai patogų sql pareiškimą, ir čia pasidalinsiu šiuo sql teiginiu ir idėjomis.

Poreikių analizė
Jei duomenų bazėje yra pasikartojančių įrašų, panaikinkite ir palikite vieną iš jų (ar pasikartojančių laukų nustatymo kriterijai yra keli laukai)


sprendimas

Kai susiduriate su šiuo poreikiu, tikriausiai turite idėją savo širdyje. Greičiausias dalykas, apie kurį galvojau, buvo tai, kad galėčiau tai išspręsti su sql teiginiu, bet buvau per seklus sudėtinguose sql teiginiuose, todėl norėjau paprašyti viršininko pagalbos.

Raskite ką nors padėti

因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给@赵七七同学,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...

Nuosavas Baidu

Radau sql pareiškimą:


Ši SQL idėja yra akivaizdi, yra šie 3 žingsniai:

  • SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Užklausti pasikartojančius įrašus lentelėje kaip sąlygą
  • SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Antroji sąlyga yra mažiausia ID reikšmė pasikartojančiuose įrašuose užklausos lentelėje
  • Galiausiai, vadovaudamiesi pirmiau nurodytomis dviem sąlygomis, panaikinkite likusius pasikartojančius įrašus, išskyrus mažiausią pasikartojančio įrašo ID


Tačiau, deja, vykdant šį sakinį įvyko klaida, o tai apytiksliai reiškia, kad lentelės negalima atnaujinti tuo pačiu metu kaip ir užklausa.


Kodas išspręstas

Remdamasis aukščiau pateiktu SQL teiginiu, manau, kad tą patį tikslą galite pasiekti dviem veiksmais naudodami kodą:

  • Pirmiausia pašalinami pasikartojantys duomenų rinkiniai
  • Remiantis užklausos duomenų rinkiniu, likę dublikatai pašalinami ciklu


Turėjau idėją ir greitai ją parašiau, bet buvau šokiruotas, kai ją paleidau, ir man jos iš tikrųjų reikėjo116skairėje ir dešinėje, tada noriu rasti SQL sakinį, kurį galėčiau naudoti, įklijuokite kodą ir vykdomą rezultatą:




Tobulas [dublikatų šalinimas ir palikti vieną] SQL

Galiausiai, aš gavau puikų atsakymą į techninę grupę, pažvelgti į šį sql pareiškimą:


Aukščiau pateiktas sql teiginys, jei atidžiai pažvelgsite, nėra sunku išsiaiškinti idėją, ir ji tikriausiai yra padalinta į 3 žingsnius, kad suprastumėte:

  • (SELECT min(id) id, user_id, pinary, consume_time FROM consum_record GROUP BY user_id, pinary, consume_time HAVING count(*) > 1 ) t2 Užklausa dėl pasikartojančių įrašų, kad būtų sudarytas rinkinys (laikina lentelė t2), kuriame yra minimalus kiekvieno įrašo dublikato ID
  • consum_record.user_id = t2.user_id ir consum_record.monetary = t2.monetary ir consum_record.consume_time = t2.consume_time Susieti pasikartojančių kriterijų laukus
  • Naikinti įrašus, kurių ID yra didesni nei T2 ID pagal sąlygas


Kai pamačiau šį sakinį, pagalvojau, kad jis per daug galingas. Toks paprastas sql pareiškimas gali išspręsti tokią sudėtingą problemą, ir laikysena kyla ~
Jis taip pat yra labai greitas paleisti, originalus kodo ciklo vykdymas trunka apie 116s, bet čia 0.3s yra pakankamai, nuostabu~







Ankstesnis:javaEE 2018 m. spalio mėn. video medžiaga
Kitą:SQL atsitiktinai modifikuoja atnaujintus duomenis
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com