Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 16501|Yanıt: 0

[Kaynak] MySQL [gereksizliği kaldır ve birini bırak] Bir sql ifadesi fikir özetini tamamlıyor

[Bağlantıyı kopyala]
Yayınlandı 13.03.2019 13:37:42 | | | |
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~







Önceki:javaEE Ekim 2018 video materyali
Önümüzdeki:SQL, güncellenen verileri rastgele değiştirir
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com