Birkaç gün önce, bir zorunluluk yaparken, mysql'deki çoğaltılmış kayıtları temizlemem gerekiyordu ve o zamanki fikir bunu kod geçişiyle yazmaktı, sonra çok karmaşık olduğunu düşündüm, sorunu bir SQL ifadesiyle çözebileceğimi düşündüm. Bilgileri kontrol ettikten ve patronla görüşdükten sonra çok uygun bir sql ifadesi ortaya çıktım ve burada bu sql ifadesini ve fikirlerini paylaşacağım.
İhtiyaç analizi
Veritabanında tekrarlanan kayıtlar varsa, birini silip sakla (tekrarlanan alanları belirleme kriterlerinin birden fazla alan olup olmadığı fark edilmez)
çözüm
Bu ihtiyaçla karşılaştığınızda, muhtemelen kalbinizde bir fikir vardır. Aklıma gelen en hızlı şey, bunu bir sql ifadesiyle çözebileceğimdi ama karmaşık sql ifadelerinde çok yüzeyseldim, bu yüzden patrondan yardım istemek istedim.
Yardım edecek birini bulun
因为这个需求有点着急,所以最开始想到的是,可以找这方面的同行来解决,然后分享这个问题给@赵七七同学,结果这货随便百度了一下,就甩给我一个从未用过的sql语句,让我自己尝试,心里万匹那啥啥啥奔腾而过...
Kendi Baidu
Bir sql ifadesi buldum:
Bu SQL fikri açık, aşağıdaki 3 adım var:
- SEÇ peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 Tabloda tekrarlanan kayıtları bir koşul olarak sorgulayın
- SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 İkinci koşul, sorgu tablosundaki tekrarlanan kayıtlarda ID'nin en küçük değeridir
- Son olarak, yukarıdaki iki koşula göre, kalan tekrarlanan kayıtları silin, sadece tekrarlanan kayıttaki en küçük kimlik hariç silinin
Ancak ne yazık ki, bu ifadeyi çalıştırırken bir hata var; bu da tablonun sorgu ile aynı anda güncellenemeyeceği anlamına gelir.
Kod çözüldü
Yukarıdaki SQL ifadesine dayanarak, aynı hedefi kod aracılığıyla iki adımda başarabileceğinizi düşünüyorum:
- Yöküntü veri setleri önce çıkarılır
- Sorgulanan veri setine göre, kalan kopyalar bir döngü içinde kaldırılır
Bir fikrim vardı ve hızlıca yazdım, ama çalıştırdığımda şok oldum ve gerçekten ihtiyacım vardı116'larsol ve sağa, sonra kullanabileceğim bir SQL ifadesi bulup kodu ve çalışan sonucu yapıştırmak istiyorum:
Mükemmel [deduplication ve bırak] SQL
Son olarak, teknik bir grupta mükemmel bir cevap aldım, şu sql ifadesine bakın:
Yukarıdaki sql ifadesine dikkatlice bakarsanız, fikri anlamak zor değildir ve anlamak için muhtemelen 3 adıma ayrılmıştır:
- (SELECT min(id) id, user_id, monetary, consume_time FROM consum_record GRUP BY user_id, parasel, consume_time HAVING COUNT(*) > 1) t2 Tekrarlanan kayıtları sorgulayarak her tekrarlanan kaydın minimum ID'sini içeren bir koleksiyon (geçici tablo t2) oluşturun
- consum_record.user_id = t2.user_id ve consum_record.monetary = t2.monetary ve consum_record.consume_time = t2.consume_time Tekrarlanan kriterler için Yardımcı alanlar
- T2'deki ID'lerden büyük olan kayıtları koşullara göre silin
Bu cümleyi gördüğümde, bunun çok güçlü olduğunu düşündüm. Böyle basit bir sql ifadesi böyle karmaşık bir problemi çözebilir ve duruş yükseliyor~ Ayrıca çok hızlı çalışıyor, orijinal kod döngüsü yürütme yaklaşık 116 saniye sürüyor, ama burada 0.3s yeterli, harika~
|