[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

transfer Milan Le Grand Bornand, any of our in в россии

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!

Tấn Việt

Tôi lập trang web này để thỏa mãn sở thích viết cái gì đó vui vui khi rãnh rỗi và đồng thời cũng chia sẻ những gì tôi biết hoặc đọc đâu đó trên mạng về Lập trình web. Tôi hi vọng những bài viết này sẽ giúp ích cho các bạn. Thân ái!

You may also like…

10 Responses

  1. Mr.Bình says:

    Bạn có thể cách này để đếm dữ liệu trùng lặp : từ khóa DISTINCT

    SELECT COUNT(DISTINCT ) from ;

    Hoặc

    SELECT COUNT(DISTINCT ,,) from ;

    • Tấn Việt says:

      Cảm ơn gợi ý của bạn 🙂

  2. Ba Lê says:

    Ở phần 2 với nội dung “Xóa các dữ liệu trùng nhau” của bạn còn có thể sử dụng thêm 1 câu lệnh như này:

    ALTER IGNORE TABLE table_name ADD UNIQUE INDEX idx_name (column_name);

  3. pe meo says:

    Cho em hỏi làm thế nào để select hết record dữ liệu nếu record nào bị trùng thì chỉ hiện 1 lần

    • Tấn Việt says:

      Mình nghĩ bạn có thể dùng lệnh DISTINCT thử xem, nếu không được thì bạn tham khảo cách xóa các dữ liệu trùng nhau (giữ lại 1 record) ở mục 2 rồi dùng SELECT * để lấy hết record.

      • pe meo says:

        cảm ơn anh đã trả lời, những em vẫn chưa hiểu
        nếu như làm như ở mục 2 thì sẽ xoá mất dữ liệu,
        em muốn chỉ show dữ liệu ra thôi, record nào bị trùng thì sẽ ko show ra nữa
        anh có thể làm 1 ví dụ cho em xem được ko

  4. Khoa says:

    Nhờ bạn trợ giúp code cho mysql trong trường hợp này:
    – 1 bảng chứa tên sinh viên (ví dụ: masv, tensv: A, B, C, D); 1 bảng chứa thông tin bảng điểm các môn của sinh viên (ví dụ: masv, ngaythangnam và cột điểm toán, lý, hóa ….)
    – trong 1 năm sinh viên sẽ có nhiều lần thi và mỗi môn sẽ có nhiều điểm khác nhau, vậy khi tìm tinh tổng số điểm các môn của các học sinh trong 1 năm, 2 năm học thì truy vấn như thế nào ạ

  5. tran says:

    có ai thức giờ này cho mình hỏi bài tí,gấp lắm ạ

  6. Nguyen Minh Quan says:

    Cho e hỏi cũng ở ví dụ trên làm sao e có thể tach ra những file csv có trùng tên, ví dụ như e sẽ tach john ra và export ra csv chỉ có john thôi và nó sẽ làm như vậy với các record còn lại

  7. an says:

    Cảm ơn bạn đã chia sẽ