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

ใช้ DISTINCT และ COUNT ร่วมกันใน MySQL Query

สามารถรวม DISTINCT เข้าไปใน COUNT() เพื่อนับค่า Unique ในคอลัมน์ได้

Syntax

COUNT(DISTINCT column_name)
COUNT(DISTINCT col1, col2, ...)  -- นับ Unique Combination

ตัวอย่าง

CREATE TABLE DistCountDemo (
    id INT,
    name VARCHAR(100),
    age INT
);

INSERT INTO DistCountDemo VALUES 
(1, 'John', 23),
(2, 'Bob', 24),
(3, 'John', 23),
(4, 'Carol', 23);

นับชื่อที่ไม่ซ้ำกัน โดยอายุ = 23

SELECT COUNT(DISTINCT name) 
FROM DistCountDemo 
WHERE age = 23;
-- ผลลัพธ์: 2 (John, Carol)

นับ Unique Combination (name, age)

SELECT COUNT(DISTINCT name, age) FROM DistCountDemo;
-- ผลลัพธ์: 3 (John-23, Bob-24, Carol-23)

เปรียบเทียบ COUNT แบบต่างๆ

Functionความหมายตัวอย่างผลลัพธ์
COUNT(*)นับทุกแถว (รวม NULL)4
COUNT(name)นับแถวที่ name ไม่ใช่ NULL4
COUNT(DISTINCT name)นับค่า name ที่ไม่ซ้ำกัน (Non-NULL)3
COUNT(DISTINCT name, age)นับ Pair (name,age) ที่ไม่ซ้ำ3

ใช้กับ GROUP BY

SELECT 
    age,
    COUNT(*) AS total_rows,
    COUNT(DISTINCT name) AS unique_names
FROM DistCountDemo
GROUP BY age
ORDER BY age;

ผลลัพธ์

+------+------------+--------------+
| age  | total_rows | unique_names |
+------+------------+--------------+
| 23   | 3          | 2            |
| 24   | 1          | 1            |
+------+------------+--------------+

Performance Notes

  • COUNT(DISTINCT ...) ต้อง Sort/Hash เพื่อ Dedup → ช้ากว่า COUNT(*)
  • สร้าง Index บนคอลัมน์ที่ COUNT DISTINCT: CREATE INDEX idx_age_name ON DistCountDemo(age, name)
  • MySQL 8.0+: ใช้ COUNT(DISTINCT ...) OVER (PARTITION BY ...) สำหรับ Window Function
  • Approximate Count (Large Data): ใช้ APPROX_COUNT_DISTINCT() (MySQL 8.0.13+)

APPROX_COUNT_DISTINCT (MySQL 8.0.13+)

SELECT APPROX_COUNT_DISTINCT(name) FROM large_table;
-- เร็วมาก Error Rate ~1-2%