Vấn đề: Trả về giá trị có tần suất cao nhất (Mode)
Cột FirstName có nhiều giá trị trùng. Cần tìm tên xuất hiện nhiều nhất.
Giải pháp: GROUP BY + ORDER BY COUNT(*) DESC + LIMIT 1
1. Tạo bảng và dữ liệu
CREATE TABLE DemoTable (FirstName VARCHAR(20));
INSERT INTO DemoTable VALUES
('Chris'), ('Mike'), ('Adam'), ('Mike'), ('Chris'), ('David'), ('Mike');
2. Dữ liệu
+-----------+
| FirstName |
+-----------+
| Chris |
| Mike |
| Adam |
| Mike |
| Chris |
| David |
| Mike |
+-----------+
3. Truy vấn giá trị xuất hiện nhiều nhất
SELECT FirstName
FROM DemoTable
GROUP BY FirstName
ORDER BY COUNT(*) DESC
LIMIT 1;
4. Kết quả
+-----------+
| FirstName |
+-----------+
| Mike |
+-----------+
'Mike' xuất hiện 3 lần (nhiều nhất).
Giải thích
GROUP BY FirstName– Gom nhóm theo tên.COUNT(*)– Đếm số hàng mỗi nhóm.ORDER BY COUNT(*) DESC– Sắp xếp nhóm theo số lượng giảm dần.LIMIT 1– Lấy nhóm đầu tiên (nhiều nhất).
Xử lý empate (nhiều giá trị cùng tần suất max)
Cách trên chỉ trả về 1 giá trị (tùy thứ tự nội bộ). Để lấy tất cả:
SELECT FirstName, COUNT(*) AS cnt
FROM DemoTable
GROUP BY FirstName
HAVING COUNT(*) = (
SELECT MAX(cnt) FROM (
SELECT COUNT(*) AS cnt FROM DemoTable GROUP BY FirstName
) AS t
);
Lưu ý
- Trên bảng lớn, đảm bảo có index trên cột nhóm.
- Nếu cần mode cho nhiều cột, lặp lại logic hoặc dùng window function (MySQL 8.0+).