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

MySQL sắp xếp bảng chữ cái và đếm trùng lặp?

Giải pháp: GROUP BY + ORDER BY

Kết hợp GROUP BY để gom nhóm đếm, và ORDER BY để sắp xếp.

Ví dụ minh họa

Tạo bảng điểm

mysql> CREATE TABLE DemoTable (
    StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentGrade CHAR(1)
);

mysql> INSERT INTO DemoTable(StudentGrade) VALUES('A'), ('F'), ('C'), ('A'), ('F'), ('F'), ('B'), ('C');

Dữ liệu gốc

+-----------+--------------+
| StudentId | StudentGrade |
+-----------+--------------+
| 1         | A            |
| 2         | F            |
| 3         | C            |
| 4         | A            |
| 5         | F            |
| 6         | F            |
| 7         | B            |
| 8         | C            |
+-----------+--------------+

Truy vấn: Sắp xếp A-Z và đếm

mysql> SELECT StudentGrade, COUNT(StudentId) AS Frequency
    -> FROM DemoTable
    -> GROUP BY StudentGrade
    -> ORDER BY StudentGrade;

Kết quả

+--------------+-----------+
| StudentGrade | Frequency |
+--------------+-----------+
| A            | 2         |
| B            | 1         |
| C            | 2         |
| F            | 3         |
+--------------+-----------+

Giải thích

  • GROUP BY StudentGrade: Gom các dòng cùng grade
  • COUNT(StudentId): Đếm số dòng mỗi nhóm (PK không NULL)
  • ORDER BY StudentGrade: Sắp xếp kết quả theo grade A-Z

Mở rộng: Sắp xếp theo tần suất

-- Giảm dần (nhiều nhất trước)
ORDER BY Frequency DESC;

-- Tăng dần (ít nhất trước)
ORDER BY Frequency ASC;

Kết quả DESC

+--------------+-----------+
| StudentGrade | Frequency |
+--------------+-----------+
| F            | 3         |
| A            | 2         |
| C            | 2         |
| B            | 1         |
+--------------+-----------+

Các biến thể COUNT

COUNT(*)           -- Tất cả dòng
COUNT(StudentId)   -- Không NULL (PK thì giống COUNT(*))
COUNT(DISTINCT StudentGrade) -- Số grade duy nhất = 4

Ứng dụng: Thống kê phân phối

SELECT 
    StudentGrade,
    COUNT(*) AS frequency,
    ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM DemoTable), 2) AS percentage
FROM DemoTable
GROUP BY StudentGrade
ORDER BY frequency DESC;

Kết quả

+--------------+-----------+------------+
| StudentGrade | frequency | percentage |
+--------------+-----------+------------+
| F            | 3         | 37.50      |
| A            | 2         | 25.00      |
| C            | 2         | 25.00      |
| B            | 1         | 12.50      |
+--------------+-----------+------------+