[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 name và location.
Tiếp theo tôi chèn một vài dữ liệu mẫu vào bảng users đó.
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 và 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.
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
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
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
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!
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 ;
Cảm ơn gợi ý của bạn 🙂
Ở 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);
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
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.
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
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 ạ
có ai thức giờ này cho mình hỏi bài tí,gấp lắm ạ
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
Cảm ơn bạn đã chia sẽ