ใช้ GROUP BY นับจำนวน COUNT(*) เรียง DESC จำกัด LIMIT 10
ไวยากรณ์
SELECT yourColumnName, COUNT(*) FROM yourTableName GROUP BY yourColumnName ORDER BY COUNT(*) DESC LIMIT 10;
สร้างตารางตัวอย่าง
mysql> CREATE TABLE countTop10Demo (Value INT);
เพิ่มข้อมูลตัวอย่าง (20 แถว มีค่าซ้ำ)
mysql> INSERT INTO countTop10Demo VALUES (10), (1100), (200), (2100), (1100), (450), (600), (2100), (150), (16454), (450), (2350), (1780), (1345), (34), (2100), (19034), (1844), (34), (16454);
แสดงข้อมูลทั้งหมด
mysql> SELECT * FROM countTop10Demo;
ผลลัพธ์ (20 แถว):
+-------+ | Value | +-------+ | 10 | | 1100 | | 200 | | 2100 | | 1100 | | 450 | | 600 | | 2100 | | 150 | | 16454 | | 450 | | 2350 | | 1780 | | 1345 | | 34 | | 2100 | | 19034 | | 1844 | | 34 | | 16454 | +-------+
Query Top 10 ค่าที่พบมากที่สุด
mysql> SELECT Value, COUNT(*)
-> FROM countTop10Demo
-> GROUP BY Value
-> ORDER BY COUNT(*) DESC
-> LIMIT 10;
ผลลัพธ์:
+-------+----------+ | Value | COUNT(*) | +-------+----------+ | 2100 | 3 | | 1100 | 2 | | 34 | 2 | | 450 | 2 | | 16454 | 2 | | 1780 | 1 | | 200 | 1 | | 1345 | 1 | | 19034 | 1 | | 600 | 1 | +-------+----------+
ขยาย: แสดง Percentage ด้วย
SELECT
Value,
COUNT(*) AS frequency,
ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM countTop10Demo), 2) AS percentage
FROM countTop10Demo
GROUP BY Value
ORDER BY frequency DESC
LIMIT 10;
กรณี Tie (จำนวนเท่ากัน) - ใช้ Tie-breaker
ORDER BY COUNT(*) DESC, Value ASC -- น้อยกว่ามาก่อน ORDER BY COUNT(*) DESC, Value DESC -- มากกว่ามาก่อน
MySQL 8.0+ ใช้ Window Function
WITH ranked AS (
SELECT Value, COUNT(*) AS freq,
ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC, Value) AS rn
FROM countTop10Demo
GROUP BY Value
)
SELECT Value, freq FROM ranked WHERE rn <= 10;
กรณีใช้งานจริง
- Top selling products
- Most visited pages
- Common error codes
- Popular tags/keywords