Muutama päivä sitten, kun tein vaatimusta, minun piti siivota kaksoiskappaleet mysql:ssä, ja silloin ajatuksena oli kirjoittaa ne koodin läpikäynnillä, mutta sitten ajattelin, että se oli liian monimutkaista, ajattelin, että ongelma pitäisi pystyä ratkaisemaan SQL-lauseella. Tarkistettuani tiedot ja konsultoituani pomoa, sain aikaan erittäin kätevän SQL-lauseen, ja tässä jaan tämän SQL-lauseen ja ideoita.
Tarveanalyysi
Jos tietokannassa on päällekkäisiä tietueita, poista ja säilytä yksi niistä (riippumatta siitä, ovatko kaksoiskenttien määrittämisen kriteerit useampia kenttiä).
ratkaisu
Kun kohtaat tämän tarpeen, sinulla on todennäköisesti ajatus sydämessäsi. Nopein ajatukseni oli, että voisin ratkaista sen sql-lauseella, mutta monimutkaisissa SQL-lauseissa olin liian pinnallinen, joten halusin pyytää apua pomolta.
Löydä joku auttamaan
因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给@赵七七同学,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...
Oma Baidu
Löysin SQL-lauseen:
Tämä SQL-idea on ilmeinen, siinä on seuraavat kolme vaihetta:
- VALITSE peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Hae duplikaattitietueita taulukosta ehtona
- VALITSE min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Toinen ehto on ID:n pienin arvo duplikaattitietueissa kyselytaulukossa
- Lopuksi, yllä mainittujen kahden ehdon mukaisesti, poista jäljellä olevat kaksoiskappaleet paitsi pienin ID kaksoiskappaleesta
Valitettavasti tämän lauseen suorittamisessa on virhe, mikä tarkoittaa suunnilleen sitä, että taulukkoa ei voi päivittää samaan aikaan kyselyn kanssa.
Koodi ratkaistu
Yllä olevan SQL-väitteen perusteella uskon, että voit saavuttaa saman tavoitteen kahdessa vaiheessa koodin avulla:
- Duplikaattiaineistot poistetaan ensin
- Kyselyaineiston perusteella jäljelle jääneet kaksoiskappaleet poistetaan silmukassa
Minulla oli idea, ja kirjoitin sen nopeasti, mutta olin järkyttynyt, kun käynnistin sen, ja oikeasti tarvitsin sen116:tvasemmalle ja oikealle, ja sitten haluan löytää SQL-lauseen, jota voin käyttää, liittää koodin ja juoksevan tuloksen:
Täydellinen [duplikointi ja jätä yksi] SQL
Lopulta sain täydellisen vastauksen teknisessä ryhmässä, katso tätä SQL-lausetta:
Yllä olevaa SQL-väitettä, jos katsoo tarkasti, idean ymmärtäminen ei ole vaikeaa, ja se on todennäköisesti jaettu kolmeen vaiheeseen ymmärtääkseen:
- (VALITSE min(id) id, user_id, monetary, consume_time FROM consum_record GROUP BY user_id, rahalliset, consume_time HAVING count(*) > 1) t2 Hae kaksoiskappaleet muodostaaksesi kokoelman (väliaikainen taulukko t2), joka sisältää kunkin kaksoiskappaleen minimi-ID:n
- consum_record.user_id = t2.user_id ja consum_record.monetary = t2.monetary ja consum_record.consume_time = t2.consume_time Associate-kentät kaksoiskriteereille
- Poista tietueet, joiden ID:t ovat suurempia kuin T2:n ID:t ehtojen mukaan
Kun näin tämän lauseen, ajattelin itsekseni, että tämä oli liian voimakas. Tällainen yksinkertainen sql-lause voi ratkaista näin monimutkaisen ongelman, ja asento nousee~ Se on myös todella nopea ajaa, alkuperäinen koodisilmukan suoritus kestää noin 116 sekuntia, mutta tässä 0,3 sekuntia riittää, mahtavaa~
|