Pirms dažām dienām, kad es veicu prasību, man vajadzēja iztīrīt ierakstu dublikātus mysql, un tajā laikā ideja bija rakstīt to, izmantojot koda šķērsošanu, un tad es domāju, ka tas ir pārāk sarežģīti, domājot, ka man vajadzētu spēt atrisināt problēmu ar sql paziņojumu. Pēc informācijas pārbaudes un konsultēšanās ar priekšnieku es nācu klajā ar ļoti ērtu sql paziņojumu, un šeit es dalīšos ar šo sql paziņojumu un idejām.
Vajadzību analīze
Ja datu bāzē ir ierakstu dublikāti, izdzēsiet un paturiet vienu no tiem (vai dublikātu lauku noteikšanas kritēriji ir vairāki lauki)
šķīdums
Kad jūs saskaraties ar šo vajadzību, jums, iespējams, sirdī ir ideja. Ātrākais, ko es domāju, bija tas, ka es to varētu atrisināt ar sql paziņojumu, bet es biju pārāk sekls sarežģītos sql paziņojumos, tāpēc es gribēju lūgt priekšniekam palīdzību.
Atrast kādu, kas palīdzētu
因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给@赵七七同学,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...
Pašu Baidu
Atradu sql paziņojumu:
Šī SQL ideja ir acīmredzama, ir šādi 3 soļi:
- SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Vaicāt ierakstu dublikātus tabulā kā nosacījumu
- SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Otrais nosacījums ir mazākā ID vērtība vaicājuma tabulas ierakstu dublikātos
- Visbeidzot, saskaņā ar diviem iepriekš minētajiem nosacījumiem izdzēsiet atlikušos ierakstu dublikātus, izņemot mazāko ID ieraksta dublikātā
Bet diemžēl šī paziņojuma izpildē ir kļūda, kas aptuveni nozīmē, ka tabulu nevar atjaunināt vienlaicīgi ar vaicājumu.
Kods atrisināts
Pamatojoties uz iepriekš minēto SQL paziņojumu, es domāju, ka jūs varat sasniegt to pašu mērķi divos soļos, izmantojot kodu:
- Vispirms tiek izņemti datu kopu dublikāti
- Pamatojoties uz vaicāto datu kopu, atlikušie dublikāti tiek noņemti cilpā
Man bija ideja, un es to ātri uzrakstīju, bet es biju šokēts, kad es to palaidu, un man tas patiešām bija vajadzīgs116. gadspa kreisi un pa labi, un tad es vēlos atrast SQL paziņojumu, ko varu izmantot, ielīmējiet kodu un izpildes rezultātu:
Perfekts [dublikātu novēršana un atstāšana vienā] SQL
Visbeidzot, es saņēmu perfektu atbildi tehniskajā grupā, apskatiet šo sql paziņojumu:
Iepriekš minētais sql paziņojums, ja jūs rūpīgi paskatāties, nav grūti izdomāt ideju, un, iespējams, tas ir sadalīts 3 soļos, lai saprastu:
- (SELECT min(id) id, user_id, monetārs, consume_time FROM consum_record GROUP BY user_id, monetārs, consume_time HAVING count(*) > 1 ) t2 Vaicāt ierakstu dublikātus, lai izveidotu kolekciju (pagaidu tabula t2), kurā ir katra ieraksta dublikāta minimālais ID
- consum_record.user_id = t2.user_id un consum_record.monetary = t2.monetary un consum_record.consume_time = t2.consume_time Saistīto lauku dublikātu kritērijiem
- Dzēst ierakstus, kuru ID ir lielāki par ID T2 saskaņā ar nosacījumiem
Kad es redzēju šo teikumu, es domāju, ka tas ir pārāk spēcīgs. Šāds vienkāršs sql paziņojums var atrisināt tik sarežģītu problēmu, un poza pieaug ~ Tas ir arī ļoti ātrs, oriģinālā koda cilpas izpilde aizņem aptuveni 116 sekundes, bet šeit pietiek ar 0,3 sekundēm, pārsteidzoši ~
|