Saya ingin menarik catatan duplikat di Database MySQL. Ini dapat dilakukan dengan:
SELECT address, count(id) as cnt FROM list
GROUP BY address HAVING cnt > 1
Yang mengakibatkan:
100 MAIN ST 2
Saya ingin menariknya sehingga memperlihatkan setiap baris yang merupakan duplikat. Sesuatu seperti:
JIM JONES 100 MAIN ST
JOHN SMITH 100 MAIN ST
Adakah pemikiran tentang bagaimana hal ini dapat dilakukan? Saya mencoba menghindari melakukan yang pertama kemudian mencari duplikat dengan kueri kedua dalam kode.
mysql
duplicates
Chris Bartow
sumber
sumber
sumber
->having(DB::raw('count(*)'), '>', 2)
ke kueri. Terimakasih banyak!>=2
? Cukup gunakanHAVING COUNT(*) > 1
Mengapa tidak BATIN GABUNG saja dengan meja sendiri?
PERBEDAAN diperlukan jika alamat bisa ada lebih dari dua kali.
sumber
WHERE a.id > b.id
memfilter duplikat yang lebih baru saja, dengan cara itu saya bisa melakukanDELETE
langsung pada hasilnya. Ganti perbandingan untuk mendaftar duplikat yang lebih lama.Saya mencoba jawaban terbaik yang dipilih untuk pertanyaan ini, tetapi agak membingungkan saya. Saya benar-benar membutuhkannya hanya pada satu bidang dari meja saya. Contoh berikut dari tautan ini bekerja sangat baik untuk saya:
sumber
Ini adalah permintaan serupa yang Anda minta dan 200% berfungsi dan mudah juga. Nikmati!!!
sumber
Bukankah ini lebih mudah:
?
sumber
Temukan pengguna duplikat berdasarkan alamat email dengan kueri ini ...
sumber
kami dapat menemukan duplikat tergantung pada lebih dari satu bidang juga. Untuk kasus-kasus Anda dapat menggunakan format di bawah ini.
sumber
Menemukan alamat duplikat jauh lebih kompleks daripada yang terlihat, terutama jika Anda membutuhkan akurasi. Permintaan MySQL tidak cukup dalam hal ini ...
Saya bekerja di SmartyStreets , tempat kami melakukan validasi dan de-duplikasi dan hal-hal lainnya, dan saya telah melihat banyak tantangan beragam dengan masalah yang sama.
Ada beberapa layanan pihak ketiga yang akan menandai duplikat dalam daftar untuk Anda. Melakukan ini hanya dengan subquery MySQL tidak akan menjelaskan perbedaan dalam format dan standar alamat. USPS (untuk alamat AS) memiliki pedoman tertentu untuk membuat standar ini, tetapi hanya segelintir vendor yang disertifikasi untuk melakukan operasi tersebut.
Jadi, saya akan merekomendasikan jawaban terbaik bagi Anda adalah dengan mengekspor tabel ke file CSV, misalnya, dan mengirimkannya ke daftar prosesor yang mampu. Salah satunya adalah Alat Validasi Alamat Massal SmartyStreets yang akan menyelesaikannya dalam beberapa detik hingga beberapa menit secara otomatis. Ini akan menandai duplikat baris dengan bidang baru yang disebut "Gandakan" dan nilai
Y
di dalamnya.sumber
Solusi lain adalah dengan menggunakan alias tabel, seperti:
Yang benar-benar Anda lakukan dalam kasus ini adalah mengambil tabel daftar asli , membuat dua tabel p retend - p 1 dan p 2 - dari itu, dan kemudian melakukan gabungan pada kolom alamat (baris 3). Baris ke-4 memastikan bahwa catatan yang sama tidak muncul beberapa kali di set hasil Anda ("duplikat duplikat").
sumber
Tidak akan menjadi sangat efisien, tetapi harus bekerja:
sumber
Ini akan memilih duplikat dalam satu pass tabel, tanpa subquery.
Permintaan ini secara aktif mengemulasi
ROW_NUMBER()
hadir dalamOracle
danSQL Server
Lihat artikel di blog saya untuk detail:
MySQL
.sumber
FROM (SELECT ...) aoo
adalah subquery :-PIni juga akan menunjukkan kepada Anda berapa banyak duplikat yang memiliki dan akan memesan hasilnya tanpa bergabung
sumber
sumber
SELECT users.name, users.uid, users.mail, from_unixtime(created) FROM users INNER JOIN ( SELECT mail FROM users GROUP BY mail HAVING count(mail) > 1 ) dup ON users.mail = dup.mail ORDER BY users.mail, users.created;
Untuk meja Anda itu akan menjadi sesuatu seperti
Kueri ini akan memberi Anda semua entri alamat yang berbeda di tabel daftar Anda ... Saya tidak yakin bagaimana ini akan bekerja jika Anda memiliki nilai kunci utama untuk nama, dll.
sumber
Prosedur kueri penghapusan duplikat tercepat:
sumber
Secara pribadi kueri ini telah menyelesaikan masalah saya:
Apa yang dilakukan skrip ini adalah menampilkan semua ID pelanggan yang ada lebih dari satu kali ke dalam tabel dan jumlah duplikat yang ditemukan.
Ini adalah kolom tabel:
Semoga bermanfaat bagi Anda juga!
sumber
Ganti kota dengan Meja Anda. Ganti nama dengan nama bidang Anda
sumber
sumber
sumber
Untuk melihat baris duplikat dengan cepat, Anda dapat menjalankan satu permintaan sederhana
Di sini saya menanyakan tabel dan mencantumkan semua baris duplikat dengan user_id, market_place, dan sku yang sama:
Untuk menghapus baris duplikat Anda harus memutuskan baris mana yang ingin Anda hapus. Misalnya yang memiliki id lebih rendah (biasanya lebih tua) atau mungkin beberapa informasi tanggal lainnya. Dalam kasus saya, saya hanya ingin menghapus id yang lebih rendah karena id yang lebih baru adalah informasi terbaru.
Pertama periksa apakah catatan yang tepat akan dihapus. Di sini saya memilih catatan di antara duplikat yang akan dihapus (oleh id unik).
Lalu saya menjalankan permintaan hapus untuk menghapus dupes:
Cadangan, Periksa ulang, verifikasi, verifikasi pencadangan kemudian jalankan.
sumber
select address from list where address = any (select address from (select address, count(id) cnt from list group by address having cnt > 1 ) as t1) order by address
sub-kueri dalam mengembalikan baris dengan alamat duplikat kemudian sub-kueri luar mengembalikan kolom alamat untuk alamat dengan duplikat. sub-kueri terluar harus mengembalikan hanya satu kolom karena digunakan sebagai operan untuk operator '= apa saja'
sumber
Jawaban Powerlord memang yang terbaik dan saya akan merekomendasikan satu perubahan lagi: gunakan LIMIT untuk memastikan db tidak akan kelebihan beban:
Merupakan kebiasaan yang baik untuk menggunakan LIMIT jika tidak ada DIMANA dan saat membuat sambungan. Mulai dengan nilai kecil, periksa seberapa berat kueri, lalu tambah batas.
sumber