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~
|