Mysql đếm các giá trị lặp lại

Tùy thuộc vào tập kết quả bạn muốn tạo, có ít nhất hai loại truy vấn SQL mà bạn có thể sử dụng để tìm các giá trị trùng lặp trong bảng cơ sở dữ liệu của mình

  • Tạo tất cả các hàng có một cột có giá trị trùng lặp
  • Tìm xem có bao nhiêu hàng có một cột có giá trị trùng lặp

Hướng dẫn này sẽ giúp bạn tìm hiểu cách viết các truy vấn tạo ra tập kết quả phù hợp

Ví dụ: giả sử bạn có bảng members với dữ liệu sau. Lưu ý rằng các hàng được đánh dấu là các hàng duy nhất trong bảng

+----+------------+----------------+
| id | first_name | country        |
+----+------------+----------------+
|  1 | Jackson    | United States  |
|  2 | Sarah      | Canada         |
|  3 | Akihiko    | Japan          |
|  4 | Matt       | United Kingdom |
|  5 | Peter      | Canada         |
|  6 | Yuko       | Japan          |
|  7 | Devon      | United States  |
|  8 | Sasuke     | Japan          |
|  9 | Nicky      | Netherlands    |
+----+------------+----------------+

Bên cạnh hàng thứ tư và thứ chín, tất cả các hàng khác đều có giá trị country trùng lặp trong bảng

Hãy bắt đầu với việc tạo tất cả các hàng có một cột có giá trị trùng lặp

Tạo tất cả các hàng có một cột có giá trị trùng lặp

Có hai phương pháp bạn có thể sử dụng để tạo tất cả các hàng có một cột có giá trị trùng lặp

  • Sử dụng truy vấn con
    SELECT country
    FROM members
    GROUP BY country
    HAVING COUNT[country] > 1
    
    0
  • Sử dụng truy vấn con
    SELECT country
    FROM members
    GROUP BY country
    HAVING COUNT[country] > 1
    
    1

Cả hai phương pháp trên đều yêu cầu bạn viết truy vấn con chỉ trả về giá trị country đã xuất hiện nhiều lần

Truy vấn con sẽ là một câu lệnh

SELECT country
FROM members
GROUP BY country
HAVING COUNT[country] > 1
3 với mệnh đề
SELECT country
FROM members
GROUP BY country
HAVING COUNT[country] > 1
4 và
SELECT country
FROM members
GROUP BY country
HAVING COUNT[country] > 1
5 như sau

SELECT country
FROM members
GROUP BY country
HAVING COUNT[country] > 1

Tập kết quả của truy vấn trên sẽ như hình bên dưới

+---------------+
| country       |
+---------------+
| United States |
| Canada        |
| Japan         |
+---------------+

Sử dụng mệnh đề

SELECT country
FROM members
GROUP BY country
HAVING COUNT[country] > 1
0, bạn có thể viết một câu lệnh
SELECT country
FROM members
GROUP BY country
HAVING COUNT[country] > 1
3 nối với một bảng tạm thời được tạo từ một truy vấn như sau

SELECT id, first_name, members.country
FROM members
INNER JOIN[
  SELECT country
  FROM members
  GROUP BY country
  HAVING COUNT[country]>1
] AS temp_tbl WHERE members.country = temp_tbl.country;

Truy vấn trên sẽ tạo ra tập kết quả sau

+----+------------+---------------+
| id | first_name | country       |
+----+------------+---------------+
|  1 | Jackson    | United States |
|  2 | Sarah      | Canada        |
|  3 | Akihiko    | Japan         |
|  5 | Peter      | Canada        |
|  6 | Yuko       | Japan         |
|  7 | Devon      | United States |
|  8 | Sasuke     | Japan         |
+----+------------+---------------+

Như bạn có thể thấy, tất cả các hàng trùng lặp được hiển thị trong tập hợp kết quả ở trên

Ngoài việc sử dụng mệnh đề

SELECT country
FROM members
GROUP BY country
HAVING COUNT[country] > 1
0, bạn cũng có thể sử dụng mệnh đề
SELECT country
FROM members
GROUP BY country
HAVING COUNT[country] > 1
1 để tạo ra kết quả tương tự như sau

SELECT id, first_name, country
FROM members
WHERE country IN [
  SELECT country
  FROM members
  GROUP BY country
  HAVING COUNT[country] > 1
];

Mệnh đề

SELECT country
FROM members
GROUP BY country
HAVING COUNT[country] > 1
1 sẽ lọc các hàng, khiến MySQL chỉ hiển thị các hàng có giá trị cột country khớp với một giá trị bên trong mệnh đề
+---------------+
| country       |
+---------------+
| United States |
| Canada        |
| Japan         |
+---------------+
2

Tìm xem có bao nhiêu hàng có một cột có giá trị trùng lặp

Bạn cũng có thể biết có bao nhiêu hàng trong bảng của mình có một trường có giá trị trùng lặp

Truy vấn sau đây sẽ hiển thị cột country cùng với số lần cột country xuất hiện trong bảng

SELECT country, COUNT[ country ] total_members
FROM members
GROUP BY country
HAVING total_members > 1;

Đầu ra sẽ được như hình dưới đây

+---------------+---------------+
| country       | total_members |
+---------------+---------------+
| United States |             2 |
| Canada        |             2 |
| Japan         |             3 |
+---------------+---------------+

Và đó là cách bạn có thể tìm các giá trị trùng lặp trong bảng MySQL của mình

Bạn có thể cần sao chép và điều chỉnh các truy vấn ví dụ ở trên để tạo ra kết quả phù hợp từ máy chủ cơ sở dữ liệu của mình

Chủ Đề