Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 15984|Odgovoriti: 0

[Vir] MySQL [odstranite redundanco in pustite eno] SQL izjava dokonča povzetek ideje

[Kopiraj povezavo]
Objavljeno na 13. 03. 2019 13:37:42 | | | |
Pred nekaj dnevi, ko sem delal zahtevo, sem moral počistiti podvojene zapise v mysql, takrat pa je bila ideja, da jih napišem prek prehoda po kodi, nato pa sem mislil, da je preveč zapleteno, saj sem mislil, da bi moral problem rešiti z SQL stavkom. Po pregledu informacij in posvetu z nadrejenim sem pripravil zelo priročno SQL izjavo, tukaj pa bom delil to SQL izjavo in ideje.

Analiza potreb
Če so v podatkovni bazi podvojeni zapisi, enega izbrišite in obdržite (ne glede na to, ali so kriteriji za določanje podvojenih polj več polj)


rešitev

Ko se srečate s to potrebo, imate verjetno idejo v srcu. Najhitrejša stvar, na katero sem pomislil, je bila, da bi jo lahko rešil z SQL stavkom, vendar sem bil preveč plitvo v zapletenih SQL stavkih, zato sem želel prositi šefa za pomoč.

Najdi nekoga, ki ti bo pomagal

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

Own Baidu

Našel sem SQL izjavo:


Ta SQL ideja je očitna, obstajajo naslednji trije koraki:

  • SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq IMA count(*) > 1 Poizvedba po podvojenih zapisih v tabeli kot pogoj
  • SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Drugi pogoj je najmanjša vrednost ID-ja v podvojenih zapisih v tabeli poizvedb
  • Nazadnje, v skladu z zgoraj navedenima dvema pogojema, izbrišite preostale podvojene zapise, razen najmanjšega ID-ja v podvojenem zapisu


Žal pa je pri izvajanju te izjave napaka, kar približno pomeni, da tabele ni mogoče posodobiti hkrati s poizvedbo.


Koda rešena

Na podlagi zgornje SQL izjave mislim, da lahko isti cilj dosežete v dveh korakih preko kode:

  • Najprej se odstranijo podvojeni podatkovni nizi
  • Na podlagi poizvedbenega nabora podatkov se preostali dvojniki odstranijo v zanki


Imel sem idejo in jo hitro napisal, a sem bil šokiran, ko sem jo zagnal, in dejansko sem jo potreboval116slevo in desno, nato pa želim najti SQL stavek, ki ga lahko uporabim, prilepim kodo in tekoči rezultat:




Popoln [deduplikacija in pusti eno] SQL

Na koncu sem dobil popoln odgovor v tehnični skupini, poglejte to SQL izjavo:


Zgornja SQL izjava, če pogledate natančno, ni težko razumeti idejo in je verjetno razdeljena na 3 korake za razumevanje:

  • (SELECT min(id) id, user_id, monetary, consume_time FROM consum_record GROUP PO user_id, monetary, consume_time HAVING count(*) > 1 ) t2 Poizvedba podvojenih zapisov za oblikovanje zbirke (začasna tabela t2), ki vsebuje minimalni ID vsakega podvojenega zapisa
  • consum_record.user_id = t2.user_id in consum_record.monetary = t2.monetary in consum_record.consume_time = t2.consume_time Povezovalna polja za podvojene kriterije
  • Izbrisati zapise z ID-ji, večjimi od ID-jev v T2, glede na pogoje


Ko sem videl ta stavek, sem si mislil, da je premočan. Tako preprosta SQL izjava lahko reši tako zapleten problem, in drža se dviguje~
Poleg tega je zelo hiter za zagon, originalno izvajanje zanke kode traja približno 116 sekund, a tukaj je 0,3 sekunde dovolj, neverjetno~







Prejšnji:javaEE video gradivo oktober 2018
Naslednji:SQL naključno spreminja posodobljene podatke
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com