Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tìm giá trị xuất hiện nhiều nhất trong cột MySQL (Mode)

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+).