การนับค่า Unique ในคอลัมน์ BIGINT ด้วย COUNT(DISTINCT)
ใช้ COUNT(DISTINCT column_name) เพื่อนับจำนวนค่าที่ไม่ซ้ำกัน (Unique) ในคอลัมน์ที่เป็น BIGINT (หมายเลขโทรศัพท์)
รูปแบบคำสั่ง
SELECT COUNT(DISTINCT phone_column) AS unique_count FROM table_name;
ตัวอย่าง: นับเบอร์โทรศัพท์ที่ไม่ซ้ำ
1. สร้างตาราง (BIGINT สำหรับเบอร์โทร)
CREATE TABLE DemoTable (PhoneNumber BIGINT);
2. เพิ่มข้อมูล (มีซ้ำ)
INSERT INTO DemoTable VALUES
(8567789898), (8567789898), (9876564534), (9087896545),
(7656456589), (9876564534), (9087896545);
3. ดูข้อมูลทั้งหมด (7 แถว)
SELECT * FROM DemoTable;
4. นับเบอร์ที่ไม่ซ้ำ
SELECT COUNT(DISTINCT PhoneNumber) AS UniquePhoneNumber FROM DemoTable;
ผลลัพธ์:
+-------------------+
| UniquePhoneNumber |
+-------------------+
| 4 |
+-------------------+
เบอร์ที่ไม่ซ้ำ: 8567789898, 9876564534, 9087896545, 7656456589 (4 เบอร์)
การทำงานของ COUNT(DISTINCT)
- สร้าง Hash Set หรือ Sort แล้วนับค่าที่ไม่ซ้ำ
- ไม่นับค่า NULL
- ใช้ Memory สำหรับการจัดเก็บค่า Unique (อาจช้า/หน่วยความจำมาก หากค่ามากมาย)
ประสิทธิภาพกับ BIGINT
- BIGINT ใช้ 8 ไบต์ เหมาะสำหรับหมายเลขโทรศัพท์ (สูงสุด 19-20 หลัก)
- Index บน BIGINT ทำงานได้ดี:
CREATE INDEX idx_phone ON DemoTable(PhoneNumber) - Index ช่วย
COUNT(DISTINCT)ได้ในบางกรณี (Loose Index Scan)
การขยาย: แสดงเบอร์ที่ซ้ำพร้อมจำนวน
SELECT PhoneNumber, COUNT(*) AS Count
FROM DemoTable
GROUP BY PhoneNumber
HAVING COUNT(*) > 1
ORDER BY Count DESC;
การขยาย: หาเบอร์ที่ซ้ำมากที่สุด (Top Duplicate)
SELECT PhoneNumber, COUNT(*) AS Count
FROM DemoTable
GROUP BY PhoneNumber
ORDER BY Count DESC
LIMIT 1;
ข้อควรระวัง: 儲存หมายเลขโทรศัพท์
- BIGINT: เหมาะสำหรับตัวเลขอย่างเดียว (ไม่มี +, -, space, 括弧)
- VARCHAR: ยืดหยุ่นกว่า รองรับรูปแบบต่างๆ (+66, 08x, 括弧, space)
- แนะนำ: เก็บเป็น VARCHAR(20) + Normalize (เก็บเฉพาะตัวเลข) ใน Application Layer