Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

4 Cara Menemukan Baris Duplikat di MySQL

Jika menurut Anda tabel MySQL mungkin memiliki baris duplikat, Anda dapat menggunakan opsi berikut untuk mengembalikan semua duplikat.

Contoh Data

Misalkan kita memiliki tabel dengan data berikut:

SELECT * FROM Pets;

Hasil:

+-------+---------+---------+
| PetId | PetName | PetType |
+-------+---------+---------+
|     1 | Wag     | Dog     |
|     1 | Wag     | Dog     |
|     2 | Scratch | Cat     |
|     3 | Tweet   | Bird    |
|     4 | Bark    | Dog     |
|     4 | Bark    | Dog     |
|     4 | Bark    | Dog     |
+-------+---------+---------+

Dua baris pertama adalah duplikat, seperti juga tiga baris terakhir. Baris duplikat berbagi nilai yang sama di semua kolom.

Opsi 1

Salah satu opsi adalah menggunakan kueri berikut untuk mengembalikan baris duplikat:

SELECT 
    DISTINCT PetId, 
    COUNT(*) AS "Count"
FROM Pets
GROUP BY PetId
ORDER BY PetId;

Hasil:

+-------+-------+
| PetId | Count |
+-------+-------+
|     1 |     2 |
|     2 |     1 |
|     3 |     1 |
|     4 |     3 |
+-------+-------+

Kita dapat memperluas SELECT daftar untuk memasukkan lebih banyak kolom jika diperlukan:

SELECT 
    PetId,
    PetName,
    PetType,
    COUNT(*) AS "Count"
FROM Pets
GROUP BY 
    PetId,
    PetName,
    PetType
ORDER BY PetId;

Hasil:

+-------+---------+---------+-------+
| PetId | PetName | PetType | Count |
+-------+---------+---------+-------+
|     1 | Wag     | Dog     |     2 |
|     2 | Scratch | Cat     |     1 |
|     3 | Tweet   | Bird    |     1 |
|     4 | Bark    | Dog     |     3 |
+-------+---------+---------+-------+

Kami dapat membuat duplikat muncul terlebih dahulu dengan mengurutkannya dengan menghitung dalam urutan menurun:

SELECT 
    PetId,
    PetName,
    PetType,
    COUNT(*) AS "Count"
FROM Pets
GROUP BY 
    PetId,
    PetName,
    PetType
ORDER BY Count DESC;

Hasil:

+-------+---------+---------+-------+
| PetId | PetName | PetType | Count |
+-------+---------+---------+-------+
|     4 | Bark    | Dog     |     3 |
|     1 | Wag     | Dog     |     2 |
|     2 | Scratch | Cat     |     1 |
|     3 | Tweet   | Bird    |     1 |
+-------+---------+---------+-------+

Opsi 2

Jika kita hanya ingin membuat daftar baris duplikat, kita dapat menggunakan HAVING klausa untuk mengecualikan non-duplikat dari output:

SELECT 
    PetId,
    PetName,
    PetType,
    COUNT(*) AS "Count"
FROM Pets
GROUP BY 
    PetId,
    PetName,
    PetType
HAVING COUNT(*) > 1
ORDER BY PetId;

Hasil:

+-------+---------+---------+-------+
| PetId | PetName | PetType | Count |
+-------+---------+---------+-------+
|     1 | Wag     | Dog     |     2 |
|     4 | Bark    | Dog     |     3 |
+-------+---------+---------+-------+

Opsi 3

Cara lain untuk melakukannya adalah dengan menggunakan ROW_NUMBER() fungsi dengan PARTITION BY klausa untuk memberi nomor pada output dari kumpulan hasil.

SELECT 
    *, 
    ROW_NUMBER() OVER ( 
        PARTITION BY PetId, PetName, PetType 
        ORDER BY PetId, PetName, PetType
        ) AS rn
FROM Pets;

Hasil:

+-------+---------+---------+----+
| PetId | PetName | PetType | rn |
+-------+---------+---------+----+
|     1 | Wag     | Dog     |  1 |
|     1 | Wag     | Dog     |  2 |
|     2 | Scratch | Cat     |  1 |
|     3 | Tweet   | Bird    |  1 |
|     4 | Bark    | Dog     |  1 |
|     4 | Bark    | Dog     |  2 |
|     4 | Bark    | Dog     |  3 |
+-------+---------+---------+----+

PARTITION BY klausa membagi set hasil yang dihasilkan oleh FROM klausa ke dalam partisi tempat fungsi diterapkan. Saat kita menentukan partisi untuk kumpulan hasil, setiap partisi menyebabkan penomoran dimulai dari awal lagi (yaitu penomoran akan dimulai dari 1 untuk baris pertama di setiap partisi).

Opsi 4

Untuk mengembalikan hanya baris surplus dari duplikat yang cocok, kita dapat menggunakan kueri di atas sebagai ekspresi tabel umum, seperti ini:

WITH cte AS 
    (
        SELECT 
            *, 
            ROW_NUMBER() OVER ( 
                PARTITION BY PetId, PetName, PetType 
                ORDER BY PetId, PetName, PetType
                ) AS rn
        FROM Pets
    )
SELECT * FROM cte WHERE rn <> 1;

Hasil:

+-------+---------+---------+----+
| PetId | PetName | PetType | rn |
+-------+---------+---------+----+
|     1 | Wag     | Dog     |  2 |
|     4 | Bark    | Dog     |  2 |
|     4 | Bark    | Dog     |  3 |
+-------+---------+---------+----+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menulis ke database MySQL dengan panda menggunakan SQLAlchemy, to_sql

  2. 4 Cara Mendaftar Semua Tabel di Database MySQL

  3. Bagaimana cara Memeriksa apakah Tombol Radio Dicentang atau Dipilih di jQuery?

  4. Cara Mendapatkan Data 12 Bulan Terakhir di MySQL

  5. #1273 - Susunan tidak diketahui:'utf8mb4_unicode_ci' cPanel