Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

นับเฉพาะค่าที่ไม่ซ้ำในคอลัมน์ MySQL ด้วย COUNT(DISTINCT)

เมื่อต้องการนับจำนวนค่าที่ไม่ซ้ำกัน (Unique Values) ในคอลัมน์ ให้ใช้ COUNT(DISTINCT column_name) ซึ่งจะข้ามค่าที่ซ้ำกันนับเพียงครั้งเดียว

สร้างตารางและข้อมูล (มีค่าซ้ำ)

mysql> create table DemoTable (
    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    FirstName varchar(10)
);
mysql> insert into DemoTable(FirstName) values 
('Larry'),('John'),('Sam'),('John'),('John'),
('Larry'),('Mike'),('Robert'),('Carol'),('Mike');

ข้อมูลในตาราง (10 แถว แต่มีซ้ำ)

+----+-----------+
| Id | FirstName |
+----+-----------+
| 1  | Larry     |
| 2  | John      |
| 3  | Sam       |
| 4  | John      |
| 5  | John      |
| 6  | Larry     |
| 7  | Mike      |
| 8  | Robert    |
| 9  | Carol     |
| 10 | Mike      |
+----+-----------+

คำสั่งนับค่า Unique

mysql> select count(distinct FirstName) from DemoTable;

ผลลัพธ์: 6 ค่าที่ไม่ซ้ำ

+---------------------------+
| count(distinct FirstName) |
+---------------------------+
| 6                         |
+---------------------------+

ค่าที่ไม่ซ้ำ: Larry, John, Sam, Mike, Robert, Carol

COUNT() vs COUNT(DISTINCT)

ฟังก์ชันผลลัพธ์คำอธิบาย
COUNT(*)10นับทุกแถว
COUNT(FirstName)10นับแถวที่ FirstName ไม่ใช่ NULL
COUNT(DISTINCT FirstName)6นับค่าที่ไม่ซ้ำกัน

ขยาย: แสดงค่า Unique พร้อมจำนวน

SELECT FirstName, COUNT(*) as frequency
FROM DemoTable
GROUP BY FirstName
ORDER BY frequency DESC;
+-----------+-----------+
| FirstName | frequency |
+-----------+-----------+
| John      | 3         |
| Larry     | 2         |
| Mike      | 2         |
| Sam       | 1         |
| Robert    | 1         |
| Carol     | 1         |
+-----------+-----------+

ประสิทธิภาพ

  • COUNT(DISTINCT) ต้องใช้ Temporary Table / Sort → ช้ากว่า COUNT(*)
  • เพิ่ม Index บนคอลัมน์ที่นับ Unique จะช่วยได้
  • ข้อมูลใหญ่ ควรใช้ APPROX_COUNT_DISTINCT() (MySQL 8.0.11+) เพื่อประมาณการเร็ว