Giải pháp: COUNT() + GROUP BY + ORDER BY
Gom nhóm theo giá trị, đếm mỗi nhóm, sắp xếp giảm dần theo số lần xuất hiện.
Ví dụ minh họa
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Value INT
);
mysql> INSERT INTO DemoTable(Value) VALUES(976), (67), (67), (1), (90), (1), (67), (976), (90), (1), (10);
Dữ liệu gốc
+----+-------+ | Id | Value | +----+-------+ | 1 | 976 | | 2 | 67 | | 3 | 67 | | 4 | 1 | | 5 | 90 | | 6 | 1 | | 7 | 67 | | 8 | 976 | | 9 | 90 | | 10 | 1 | | 11 | 10 | +----+-------+
Truy vấn đếm tần suất
mysql> SELECT Value, COUNT(Value) AS ValueFrequency
-> FROM DemoTable
-> GROUP BY Value
-> ORDER BY ValueFrequency DESC;
Kết quả
+-------+----------------+ | Value | ValueFrequency | +-------+----------------+ | 67 | 3 | | 1 | 3 | | 90 | 2 | | 976 | 2 | | 10 | 1 | +-------+----------------+
Lấy TOP N giá trị phổ biến nhất
-- Top 3 SELECT Value, COUNT(*) AS freq FROM DemoTable GROUP BY Value ORDER BY freq DESC LIMIT 3;
Xử lý tie (hòa): Lấy tất cả top frequency
SELECT Value, COUNT(*) AS freq FROM DemoTable GROUP BY Value HAVING freq = (SELECT MAX(cnt) FROM (SELECT COUNT(*) AS cnt FROM DemoTable GROUP BY Value) t);
Ứng dụng thực tế
| Tình huống | Cột |
|---|---|
| Sản phẩm bán chạy | product_id trong orders |
| Từ khóa tìm kiếm hot | keyword trong search_logs |
| Lỗi thường gặp | error_code trong error_logs |
| Giờ cao điểm | HOUR(created_at) trong orders |
| Domain email phổ biến | SUBSTRING_INDEX(email, '@', -1) trong users |
Hiệu năng
- Index trên cột Value:
CREATE INDEX idx_value ON DemoTable(Value) - Covering index:
CREATE INDEX idx_value_id ON DemoTable(Value, Id) - Bảng cực lớn: Cân nhắc materialized view hoặc summary table cập nhật định kỳ
Mở rộng: Mode (giá trị xuất hiện nhiều nhất) trong statistics
SELECT Value AS mode_value FROM DemoTable GROUP BY Value ORDER BY COUNT(*) DESC LIMIT 1;