Saya memiliki tabel dengan kolom varchar, dan saya ingin menemukan semua catatan yang memiliki nilai duplikat di kolom ini. Apa permintaan terbaik yang bisa saya gunakan untuk menemukan duplikat?
Saya memiliki tabel dengan kolom varchar, dan saya ingin menemukan semua catatan yang memiliki nilai duplikat di kolom ini. Apa permintaan terbaik yang bisa saya gunakan untuk menemukan duplikat?
Jawaban:
Lakukan SELECT
dengan GROUP BY
klausa. Katakanlah nama adalah kolom yang ingin Anda temukan duplikatnya:
SELECT name, COUNT(*) c FROM table GROUP BY name HAVING c > 1;
Ini akan mengembalikan hasil dengan nilai nama di kolom pertama, dan hitungan berapa kali nilai itu muncul di kolom kedua.
GROUP_CONCAT(id)
dan itu akan mencantumkan ID. Lihat jawaban saya sebagai contoh.
ERROR: column "c" does not exist LINE 1
?
SELECT varchar_col
FROM table
GROUP BY varchar_col
HAVING COUNT(*) > 1;
IN()
/ NOT IN()
.
SELECT *
FROM mytable mto
WHERE EXISTS
(
SELECT 1
FROM mytable mti
WHERE mti.varchar_column = mto.varchar_column
LIMIT 1, 1
)
Kueri ini mengembalikan catatan lengkap, bukan hanya berbeda varchar_column
.
Kueri ini tidak digunakan COUNT(*)
. Jika ada banyak duplikat, COUNT(*)
mahal, dan Anda tidak perlu keseluruhan COUNT(*)
, Anda hanya perlu tahu apakah ada dua baris dengan nilai yang sama.
Memiliki indeks atas varchar_column
kehendak, tentu saja, sangat mempercepat permintaan ini.
ORDER BY varchar_column DESC
ke akhir permintaan.
GROUP BY
dan HAVING
hanya mengembalikan satu dari kemungkinan duplikat. Juga, kinerja dengan bidang yang diindeks alih-alih COUNT(*)
, dan kemungkinan ORDER BY
untuk mengelompokkan rekaman duplikat.
Membangun jawaban levik untuk mendapatkan ID dari duplikat baris yang dapat Anda lakukan GROUP_CONCAT
jika server Anda mendukungnya (ini akan mengembalikan daftar id yang dipisahkan koma).
SELECT GROUP_CONCAT(id), name, COUNT(*) c FROM documents GROUP BY name HAVING c > 1;
SELECT id, GROUP_CONCAT(id), name, COUNT(*) c [...]
ini memungkinkan pengeditan sisip dan harus memperbarui semua baris yang terlibat (atau setidaknya yang pertama cocok), tetapi sayangnya hasil edit menghasilkan kesalahan Javascript. ..
Dengan asumsi tabel Anda bernama TableABC dan kolom yang Anda inginkan adalah Kol dan kunci utama untuk T1 adalah Kunci.
SELECT a.Key, b.Key, a.Col
FROM TableABC a, TableABC b
WHERE a.Col = b.Col
AND a.Key <> b.Key
Keuntungan dari pendekatan ini daripada jawaban di atas adalah memberikan Kunci.
Untuk menemukan berapa banyak rekaman duplikat di kolom nama di Karyawan, pertanyaan di bawah ini sangat membantu;
Select name from employee group by name having count(*)>1;
untuk mendapatkan semua data yang mengandung duplikasi saya menggunakan ini:
SELECT * FROM TableName INNER JOIN(
SELECT DupliactedData FROM TableName GROUP BY DupliactedData HAVING COUNT(DupliactedData) > 1 order by DupliactedData)
temp ON TableName.DupliactedData = temp.DupliactedData;
TableName = tabel yang Anda kerjakan.
DupliactedData = data duplikat yang Anda cari.
Kueri terakhir saya memasukkan beberapa jawaban di sini yang membantu - menggabungkan grup dengan, menghitung & GROUP_CONCAT.
SELECT GROUP_CONCAT(id), `magento_simple`, COUNT(*) c
FROM product_variant
GROUP BY `magento_simple` HAVING c > 1;
Ini memberikan id dari kedua contoh (dipisahkan koma), barcode yang saya butuhkan, dan berapa banyak duplikat.
Ubah tabel dan kolom sesuai kebutuhan.
Saya tidak melihat pendekatan GABUNG, yang memiliki banyak kegunaan dalam hal duplikat.
Pendekatan ini memberi Anda hasil berlipat ganda yang sebenarnya.
SELECT t1.* FROM my_table as t1
LEFT JOIN my_table as t2
ON t1.name=t2.name and t1.id!=t2.id
WHERE t2.id IS NOT NULL
ORDER BY t1.name
SELECT t.*,(select count(*) from city as tt
where tt.name=t.name) as count
FROM `city` as t
where (
select count(*) from city as tt
where tt.name=t.name
) > 1 order by count desc
Ganti kota dengan Meja Anda. Ganti nama dengan nama bidang Anda
Mengambil jawaban @ maxyfc lebih lanjut, saya perlu menemukan semua baris yang dikembalikan dengan nilai duplikat, sehingga saya bisa mengeditnya di MySQL Workbench :
SELECT * FROM table
WHERE field IN (
SELECT field FROM table GROUP BY field HAVING count(*) > 1
) ORDER BY field
Saya melihat hasil di atas dan permintaan akan berfungsi dengan baik jika Anda perlu memeriksa nilai kolom tunggal yang merupakan duplikat. Misalnya email.
Tetapi jika Anda perlu memeriksa dengan lebih banyak kolom dan ingin memeriksa kombinasi hasilnya, maka kueri ini akan berfungsi dengan baik:
SELECT COUNT(CONCAT(name,email)) AS tot,
name,
email
FROM users
GROUP BY CONCAT(name,email)
HAVING tot>1 (This query will SHOW the USER list which ARE greater THAN 1
AND also COUNT)
SELECT COUNT(CONCAT(userid,event,datetime)) AS total, userid, event, datetime FROM mytable GROUP BY CONCAT(userid, event, datetime ) HAVING total>1
Saya lebih suka menggunakan fungsi berjendela (MySQL 8.0+) untuk menemukan duplikat karena saya bisa melihat seluruh baris:
WITH cte AS (
SELECT *
,COUNT(*) OVER(PARTITION BY col_name) AS num_of_duplicates_group
,ROW_NUMBER() OVER(PARTITION BY col_name ORDER BY col_name2) AS pos_in_group
FROM table
)
SELECT *
FROM cte
WHERE num_of_duplicates_group > 1;
SELECT
t.*,
(SELECT COUNT(*) FROM city AS tt WHERE tt.name=t.name) AS count
FROM `city` AS t
WHERE
(SELECT count(*) FROM city AS tt WHERE tt.name=t.name) > 1 ORDER BY count DESC
Berikut ini akan menemukan semua product_id yang digunakan lebih dari sekali. Anda hanya mendapatkan satu catatan untuk setiap product_id.
SELECT product_id FROM oc_product_reward GROUP BY product_id HAVING count( product_id ) >1
Kode diambil dari: http://chandreshrana.blogspot.in/2014/12/find-duplicate-records-based-on-any.html
CREATE TABLE tbl_master
(`id` int, `email` varchar(15));
INSERT INTO tbl_master
(`id`, `email`) VALUES
(1, 'test1@gmail.com'),
(2, 'test2@gmail.com'),
(3, 'test1@gmail.com'),
(4, 'test2@gmail.com'),
(5, 'test5@gmail.com');
QUERY : SELECT id, email FROM tbl_master
WHERE email IN (SELECT email FROM tbl_master GROUP BY email HAVING COUNT(id) > 1)
SELECT DISTINCT a.email FROM `users` a LEFT JOIN `users` b ON a.email = b.email WHERE a.id != b.id;
a.email
ke a.*
dan mendapatkan semua ID dari baris dengan duplikat.
SELECT DISTINCT a.*
diselesaikan hampir secara instan.
Untuk menghapus duplikat baris dengan beberapa bidang, pertama-tama batal mereka ke kunci unik baru yang ditentukan untuk satu-satunya baris yang berbeda, kemudian gunakan perintah "grup dengan" untuk menghapus baris duplikat dengan kunci unik baru yang sama:
Create TEMPORARY table tmp select concat(f1,f2) as cfs,t1.* from mytable as t1;
Create index x_tmp_cfs on tmp(cfs);
Create table unduptable select f1,f2,... from tmp group by cfs;
CREATE TEMPORARY TABLE ...
? Sedikit penjelasan tentang solusi Anda akan sangat bagus.
Satu kontribusi yang sangat terlambat ... kalau-kalau ada orang yang membantu ... Saya punya tugas untuk menemukan pasangan transaksi yang cocok (sebenarnya kedua sisi transfer antar-akun) dalam aplikasi perbankan, untuk mengidentifikasi mana yang adalah 'dari' dan 'ke' untuk setiap transaksi antar rekening, jadi kami berakhir dengan ini:
SELECT
LEAST(primaryid, secondaryid) AS transactionid1,
GREATEST(primaryid, secondaryid) AS transactionid2
FROM (
SELECT table1.transactionid AS primaryid,
table2.transactionid AS secondaryid
FROM financial_transactions table1
INNER JOIN financial_transactions table2
ON table1.accountid = table2.accountid
AND table1.transactionid <> table2.transactionid
AND table1.transactiondate = table2.transactiondate
AND table1.sourceref = table2.destinationref
AND table1.amount = (0 - table2.amount)
) AS DuplicateResultsTable
GROUP BY transactionid1
ORDER BY transactionid1;
Hasilnya adalah bahwa DuplicateResultsTable
menyediakan baris yang berisi transaksi yang cocok (yaitu duplikat), tetapi juga memberikan id transaksi yang sama secara terbalik saat kedua cocok dengan pasangan yang sama, sehingga bagian luar SELECT
ada untuk dikelompokkan berdasarkan ID transaksi pertama, yang dilakukan dengan menggunakan LEAST
dan GREATEST
memastikan kedua transaksi itu selalu dalam urutan yang sama dalam hasil, yang membuatnya aman untuk GROUP
yang pertama, sehingga menghilangkan semua kecocokan duplikat. Telusuri hampir satu juta catatan dan identifikasi 12.000+ pertandingan hanya dalam waktu kurang dari 2 detik. Tentu saja transactionid adalah indeks utama, yang sangat membantu.
Select column_name, column_name1,column_name2, count(1) as temp from table_name group by column_name having temp > 1
SELECT ColumnA, COUNT( * )
FROM Table
GROUP BY ColumnA
HAVING COUNT( * ) > 1
Jika Anda ingin menghapus penggunaan duplikat DISTINCT
Kalau tidak gunakan pertanyaan ini:
SELECT users.*,COUNT(user_ID) as user FROM users GROUP BY user_name HAVING user > 1;
Coba gunakan permintaan ini:
SELECT name, COUNT(*) value_count FROM company_master GROUP BY name HAVING value_count > 1;