การนับจำนวนรายการของแต่ละ FileID ด้วย COUNT() และ GROUP BY
ใช้ COUNT() ร่วมกับ GROUP BY FileID เพื่อนับจำนวนแถวของแต่ละ FileID และแสดงในคอลัมน์ใหม่
รูปแบบคำสั่ง
SELECT FileID, COUNT(*) AS EntryCount
FROM table_name
GROUP BY FileID;
ตัวอย่าง: นับจำนวน Entry ของแต่ละ FileID
1. สร้างตาราง (มี AUTO_INCREMENT เริ่ม 100)
CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
FileID INT
) AUTO_INCREMENT = 100;
2. เพิ่มข้อมูล (FileID ซ้ำกัน)
INSERT INTO DemoTable (FileID) VALUES (50), (60), (50), (70), (60), (50);
3. ดูข้อมูลทั้งหมด
SELECT * FROM DemoTable;
ผลลัพธ์:
+-----+---------+
| Id | FileID |
+-----+---------+
| 100 | 50 |
| 101 | 60 |
| 102 | 50 |
| 103 | 70 |
| 104 | 60 |
| 105 | 50 |
+-----+---------+
4. นับจำนวนแต่ละ FileID
SELECT FileID, COUNT(*) AS EntryCount
FROM DemoTable
GROUP BY FileID;
ผลลัพธ์:
+---------+------------+
| FileID | EntryCount |
+---------+------------+
| 50 | 3 |
| 60 | 2 |
| 70 | 1 |
+---------+------------+
หมายเหตุ: COUNT(FieldId) ในต้นฉบับผิด
คำสั่งต้นฉบับเขียน COUNT(FieldId) แต่คอลัมน์ชื่อ FileID ควรเป็น COUNT(*) หรือ COUNT(FileID)
การขยาย: เรียงตามจำนวนมากไปน้อย
SELECT FileID, COUNT(*) AS EntryCount
FROM DemoTable
GROUP BY FileID
ORDER BY EntryCount DESC;
การขยาย: กรองเฉพาะที่ซ้ำ (Count > 1)
SELECT FileID, COUNT(*) AS EntryCount
FROM DemoTable
GROUP BY FileID
HAVING COUNT(*) > 1;
ประสิทธิภาพ
- สร้าง Index บน FileID:
CREATE INDEX idx_fileid ON DemoTable(FileID) - Index จะช่วย GROUP BY เร็วขึ้น (Loose Index Scan)
- EXPLAIN เพื่อดูว่าใช้ Index หรือไม่
กรณี FileID เป็น NULL
-- GROUP BY จะจัดกลุ่ม NULL เป็นกลุ่มเดียว
SELECT FileID, COUNT(*) FROM DemoTable GROUP BY FileID;
-- หากไม่นับ NULL
SELECT FileID, COUNT(FileID) FROM DemoTable GROUP BY FileID;
-- COUNT(FileID) ไม่นับ NULL, COUNT(*) นับทุกแถว