Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Đếm số giá trị chỉ xuất hiện một lần trong cột MySQL?

Sử dụng GROUP BY ... HAVING COUNT(*) = 1 để lọc các giá trị duy nhất, sau đó đếm số lượng nhóm đó.

Tạo bảng

mysql> CREATE TABLE DemoTable (Name VARCHAR(20));

Chèn dữ liệu (có trùng lặp)

mysql> INSERT INTO DemoTable VALUES('Larry'), ('Larry'), ('Sam'), ('Chris'), ('Sam'), ('Mike'), ('Sam'), ('Larry'), ('Mike'), ('Mike'), ('Carol'), ('Robert');

Xem dữ liệu (12 hàng)

+--------+
| Name   |
+--------+
| Larry  |
| Larry  |
| Sam    |
| Chris  |
| Sam    |
| Mike   |
| Sam    |
| Larry  |
| Mike   |
| Mike   |
| Carol  |
| Robert |
+--------+

Thống kê: Larry(3), Sam(3), Mike(4), Chris(1), Carol(1), Robert(1)

Đếm tên chỉ xuất hiện 1 lần

mysql> SELECT COUNT(Name) FROM (
    ->     SELECT Name FROM DemoTable 
    ->     GROUP BY Name 
    ->     HAVING COUNT(*) = 1
    -> ) AS AppearOnce;
+-------------+
| COUNT(Name) |
+-------------+
| 3           |
+-------------+

Kết quả 3: Chris, Carol, Robert

Giải thích

  1. Truy vấn con: GROUP BY Name HAVING COUNT(*) = 1 → trả về các tên duy nhất (Chris, Carol, Robert)
  2. Truy vấn cha: COUNT(Name) đếm số hàng của truy vấn con → 3

Cách viết gọn hơn (MySQL 8.0+ CTE)

WITH UniqueNames AS (
    SELECT Name FROM DemoTable GROUP BY Name HAVING COUNT(*) = 1
)
SELECT COUNT(*) FROM UniqueNames;

Mở rộng: Liệt kê cả tên và tần suất

SELECT Name, COUNT(*) AS Freq 
FROM DemoTable 
GROUP BY Name 
HAVING COUNT(*) = 1;
+-------+------+
| Name  | Freq |
+-------+------+
| Chris | 1    |
| Carol | 1    |
| Robert| 1    |
+-------+------+