Vấn đề:
Bạn có các hàng trùng lặp trong bảng của mình, chỉ có các ID là duy nhất. Làm cách nào để bạn tìm thấy những mục trùng lặp đó?
Ví dụ:
Cơ sở dữ liệu của chúng tôi có một bảng tên là product
với dữ liệu trong các cột sau:id
, name
và category
.
id | tên | loại |
---|---|---|
1 | bít tết | thịt |
2 | bánh | kẹo |
3 | d> bít tết | thịt |
4 | thịt lợn | thịt |
5 | bánh | kẹo |
6 | bánh | kẹo |
Hãy tìm các tên và danh mục sản phẩm trùng lặp. Bạn có thể tìm thấy các bản sao bằng cách nhóm các hàng, sử dụng COUNT
hàm tổng hợp và chỉ định một HAVING
mệnh đề để lọc các hàng.
Giải pháp:
SELECT name, category, FROM product GROUP BY name, category HAVING COUNT(id) >1;
Truy vấn này chỉ trả về các bản ghi trùng lặp — những bản ghi có cùng tên sản phẩm và danh mục:
name | loại |
---|---|
bít tết | thịt |
bánh | đồ ngọt |
Có hai sản phẩm trùng lặp trong bảng của chúng tôi:bít tết từ danh mục thịt và bánh ngọt từ danh mục đồ ngọt. Sản phẩm đầu tiên được lặp lại hai lần trong bảng, trong khi sản phẩm thứ hai xuất hiện ba lần.
Thảo luận:
Để chọn các giá trị trùng lặp, bạn cần tạo các nhóm hàng có cùng giá trị và sau đó chọn các nhóm có số lượng lớn hơn một. Bạn có thể đạt được điều đó bằng cách sử dụng GROUP BY
và một HAVING
mệnh đề.
Bước đầu tiên là tạo các nhóm bản ghi có cùng giá trị trong tất cả các cột không phải ID (trong ví dụ của chúng tôi là name
và category
). Bạn thực hiện việc này với GROUP BY
mệnh đề. Sau GROUP BY
từ khóa, bạn đặt tên của các cột bạn muốn sử dụng để nhóm. Chúng tôi loại trừ id
vì đó là khóa chính của bảng của chúng tôi; theo định nghĩa, mỗi hàng sẽ có một giá trị khác nhau dưới cột đó. Nếu chúng tôi bao gồm nó, thì chúng tôi sẽ không thể phát hiện ra các bản sao!
Chúng tôi muốn tìm các nhóm có nhiều hơn một hàng; các nhóm như vậy phải chứa một bản sao theo định nghĩa, miễn là chúng tôi đã nhóm trên các cột chính xác. Để thực hiện việc này, chúng tôi sử dụng HAVING
mệnh đề. Điều kiện chúng tôi chỉ định là số phần tử trong nhóm— COUNT(id)
—Phải lớn hơn một:COUNT(id) > 1
. Hãy nhớ rằng HAVING
cho phép bạn lọc các nhóm; WHERE
là để lọc các hàng riêng lẻ.