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

Đếm tần suất giá trị xuất hiện nhiều nhất trong MySQL?

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ốngCột
Sản phẩm bán chạyproduct_id trong orders
Từ khóa tìm kiếm hotkeyword trong search_logs
Lỗi thường gặperror_code trong error_logs
Giờ cao điểmHOUR(created_at) trong orders
Domain email phổ biếnSUBSTRING_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;