menu

[Web] Tìm dữ liệu trùng lặp trong MySQL




Nếu bạn là một lập trình viên thì đôi khi bạn sẽ làm 1 dự án nào đó với dự liệu lớn (hơn 2 triệu record chẳng hạn) và điều không may là trong Database khách hàng đưa cho bạn, có vài record với nội dung trùng lặp nhau. Bạn cần loại bỏ những record trùng lặp đó để tiếp tục công việc. Bài viết hôm nay tôi sẽ giới thiệu đến các bạn cách loại bỏ những dữ liệu trùng lặp trong MySQL.
Đầu tiên tôi tạo ra một bảng users đơn giản chứa thông tin người dùng gồm namelocation.
Tìm dữ liệu trùng lặp trong MySQL
Tiếp theo tôi chèn một vài dữ liệu mẫu vào bảng users đó.
Tìm dữ liệu trùng lặp trong MySQL
Bây giờ là tới nội dung chính của bài viết hôm nay. Đó là tôi sẽ sử dụng câu truy vấn để tìm những dữ liệu trùng lặp nhau trong MySQL.
SELECT * , COUNT(*) AS number_record
FROM users
GROUP BY name
HAVING number_record > 1
Thật ra câu lệnh tìm dữ liệu trùng lặp cũng không có gì phức tạp lắm, nếu bạn thường sử dụng các lệnh MySQL để truy vấn dữ liệu thì chắc hẳn đã biết đến lệnh HAVING GROUP BY  vốn được sử dụng trong các trường hợp liên quan đến tập hợp dữ liệu. Trong trường hợp này chúng ta sẽ dùng lệnh GROUP BY để nhóm các record lại, sau đó dùng lệnh HAVING để lọc ra những record trùng lặp có số lượng lớn hơn 1.
Sau khi truy vấn, tôi đã có được kết quả mong muốn và biết được số lượng những record trùng lặp.
Tìm những record trùng nhau trong MySQL

1, Hiển thị các dữ liệu trùng nhau

Nếu các bạn muốn hiển thị nội dung đầy đủ của các record trùng nhau thì các bạn hãy dùng câu lệnh dưới đây
SELECT *
FROM users
WHERE name IN (
    SELECT name
    FROM users
    GROUP BY name
    HAVING COUNT(name) > 1
)
ORDER BY name
Kết quả thu được
Tìm những record trùng nhau trong MySQL

2, Xóa các dữ liệu trùng nhau (giữ lại 1 record)

Để xóa những record trùng nhau trong Database lớn thì chúng ta không thể nào thực hiện bằng tay được, thay vào đó chúng ta nên dùng các câu lệnh MySQL dưới đây để xóa nhằm tiết kiệm thời gian và không bỏ sót dữ liệu.
Câu lệnh dưới đây sẽ xóa những record trùng nhau nhưng giữ lại 1 record trong số đó. Giả sử trong Database có 3 record trùng nhau thì câu lệnh sẽ xóa 2 record và giữ lại 1 record. Nếu bạn vẫn muốn xóa hết những record trùng nhau thì hãy tham khảo mục 3.
DELETE n1
FROM users n1, users n2
WHERE n1.name = n2.name AND n1.id > n2.id
Kết quả thu được sau khi xóa
Xóa những record trùng nhau trong MySQL

3, Xóa hoàn toàn các dữ liệu trùng nhau ra khỏi Database

Câu lệnh dưới đây sẽ loại bỏ hoàn toàn các dữ liệu trùng nhau ra khỏi Database, tức là nếu có 2 record giống nhau thì sẽ xóa hết 2 record đó.
DELETE FROM users
USING users, users AS virtual_users
WHERE (NOT users.id = virtual_users.id) AND (users.name = virtual_users.name)
Sau khi loại bỏ hoàn toàn các dữ liệu trùng nhau sẽ thu được kết quả sau
Xóa những record trùng nhau trong MySQL

4, Mở rộng

Nếu bạn thiết kế hoặc làm việc với Database lớn thì hãy tham khảo bài viết này để tránh tạo ra những record trùng lặp trong MySQL nhé.
Hi vọng bài viết giúp ích cho các bạn. Thân ái!

Không có nhận xét nào:

Đăng nhận xét