Trang chủ » MySQL » Cách xóa bản ghi trùng trong MySQL

MySQL

Cách xóa bản ghi trùng trong MySQL

09/12/2023

Trong bài viết này mình sẽ hướng dẫn các bạn cách để xóa dữ liệu trùng lặp trong MySQL.

Bước 1: Chuẩn bị dữ liệu

Đoạn code dưới sẽ tạo bảng customers và thêm vào một vài dữ liệu để làm mẫu:


DROP TABLE IF EXISTS customers;
 
CREATE TABLE customers (
    id INT PRIMARY KEY AUTO_INCREMENT,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL, 
    email VARCHAR(255) NOT NULL
);
 
INSERT INTO customers (first_name,last_name,email) 
VALUES ('Carine ','Schmitt','carine.schmitt@verizon.net'),
       ('Jean','King','jean.king@me.com'),
       ('Peter','Ferguson','peter.ferguson@google.com'),
       ('Janine ','Labrune','janine.labrune@aol.com'),
       ('Jonas ','Bergulfsen','jonas.bergulfsen@mac.com'),
       ('Janine ','Labrune','janine.labrune@aol.com'),
       ('Susan','Nelson','susan.nelson@comcast.net'),
       ('Zbyszek ','Piestrzeniewicz','zbyszek.piestrzeniewicz@att.net'),
       ('Roland','Keitel','roland.keitel@yahoo.com'),
       ('Julie','Murphy','julie.murphy@yahoo.com'),
       ('Kwai','Lee','kwai.lee@google.com'),
       ('Jean','King','jean.king@me.com'),
       ('Susan','Nelson','susan.nelson@comcast.net'),
       ('Roland','Keitel','roland.keitel@yahoo.com');

Bước 2: Tìm dữ liệu trùng lặp email


SELECT 
    email, COUNT(email)
FROM
    customers
GROUP BY 
    email
HAVING 
    COUNT(email) > 1;

Chúng ta có 4 kết quả trùng lặp

Sử dụng DELETE JOIN để xóa dữ liệu trùng

Truy vấn sau sẽ xóa các dữ liệu trùng và giữ lại dữ liệu có id lớn nhất:


DELETE t1 FROM customers t1
        INNER JOIN
    customers t2 
WHERE
    t1.id < t2.id AND t1.email = t2.email;

Kết quả:


Query OK, 4 rows affected (0.10 sec)

Bây giờ chúng ta thử tìm lại các email trùng lặp:


SELECT 
    email, 
    COUNT(email)
FROM
    customers
GROUP BY 
    email
HAVING 
    COUNT(email) > 1;

Kết quả trả về rỗng, như vậy không có dữ liệu trùng lặp email

Kiểm tra lại lần nữa:


SELECT * FROM customers;

Các rows với id 2, 4, 7, và 9 đã được xóa.

Trong trường hợp khi xóa dữ liệu trùng mà vẫn muốn giữ lại id bé nhất thì sử dụng query sau:


DELETE t1 FROM customers t1
        INNER JOIN
    customers t2 
WHERE
    t1.id > t2.id AND t1.email = t2.email;

Các bạn có thể thử nghiệm và xem kết quả nhé

 

Bài viết liên quan


Có nhiều loại dữ liệu khác nhau được hỗ trợ trong MySQL. Trong số đó đôi khi chúng ta cần dùng đến kiểu dữ liệu DATE để lưu trữ giá trị dữ liệu. Kiểu dữ liệu DATE được sử dụng cho các giá trị có phần ngày nhưng không có phần thời gian.

22:38 . 10/01/2024

Hàm WEEKDAY() trong MySQL được sử dụng để tìm giá trị ngày trong tuần cho một ngày cụ thể. Nếu ngày là NULL thì hàm WEEKDAY() sẽ trả về NULL. Ngược lại, nó trả về chỉ mục cho một ngày, tức là 0 cho Thứ Hai, 1 cho Thứ Ba,... 6 cho Chủ Nhật.

22:38 . 30/12/2023

Hàm SEC_TO_TIME() trong MySQL được sử dụng để chuyển đổi một giá trị thời gian (trong đơn vị giây) thành dạng chuỗi thời gian.

22:33 . 30/12/2023

Hàm YEARWEEK() trong MySQL được sử dụng để trả về một số nguyên đại diện cho tuần trong năm, dựa trên một giá trị ngày hoặc ngày/tháng cung cấp

22:30 . 30/12/2023

Hàm YEAR() trong MySQL được sử dụng để trích xuất phần năm từ một giá trị ngày hoặc ngày/tháng

22:10 . 30/12/2023

Hàm LTRIM() trong MySQL được sử dụng để loại bỏ các ký tự khoảng trắng từ phía bên trái (bắt đầu) của một chuỗi ký tự.

22:03 . 30/12/2023

Hàm DAYOFWEEK() trong MySQL được sử dụng để trả về một số nguyên đại diện cho ngày trong tuần (từ 1 đến 7), với Chủ nhật là ngày đầu tiên (1) và Thứ Bảy là ngày cuối cùng (7).

09:01 . 30/12/2023

Hàm DATE_SUB() trong MySQL được sử dụng để trừ một khoảng thời gian cụ thể từ một giá trị ngày/tháng cung cấp.

08:52 . 30/12/2023

Hàm DATE_FORMAT() trong MySQL được sử dụng để định dạng một ngày cụ thể theo giá trị định dạng đã cho, tức là, một ngày sẽ được cung cấp và hàm này sẽ định dạng ngày đó theo các tham số định dạng đã chỉ định.

 

0988 542 856
0988 542 856