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

Đưa bản ghi cụ thể lên đầu kết quả MySQL với ORDER BY CASE


Vấn đề

Muốn các bản ghi có StudentName = 'John' xuất hiện **đầu tiên**, sau đó các bản ghi khác sắp xếp theo tên, điểm.

Giải pháp: ORDER BY CASE

ORDER BY CASE StudentName WHEN 'John' THEN 2 ELSE 3 END, StudentName, StudentMarks

Ví dụ minh họa

Tạo bảng và chèn dữ liệu

mysql> CREATE TABLE DemoTable (
    StudentName VARCHAR(100), StudentMarks INT
);
mysql> INSERT INTO DemoTable VALUES 
('Chris', 45), ('John', 67), ('David', 89), ('John', 98), ('Mike', 79), ('John', 99);

Truy vấn

mysql> SELECT * FROM DemoTable 
ORDER BY CASE StudentName WHEN 'John' THEN 2 ELSE 3 END, StudentName, StudentMarks;

Kết quả

+-------------+--------------+
| StudentName | StudentMarks |
+-------------+--------------+
| John        | 67           |
| John        | 98           |
| John        | 99           |
| Chris       | 45           |
| David       | 89           |
| Mike        | 79           |
+-------------+--------------+

Giải thích

  • CASE StudentName WHEN 'John' THEN 2 ELSE 3 END: John → 2, khác → 3.
  • ORDER BY ... ASC (mặc định): 2 < 3 → John lên đầu.
  • Trong nhóm John: sắp thêm StudentName (giống nhau), rồi StudentMarks ASC.

Cách ngắn gọn hơn: FIELD()

ORDER BY FIELD(StudentName, 'John') DESC, StudentName, StudentMarks
  • FIELD('John', 'John') = 1, FIELD('Chris', 'John') = 0.
  • DESC: 1 > 0 → John lên đầu.

Mở rộng: Nhiều giá trị ưu tiên

ORDER BY FIELD(StudentName, 'John', 'David', 'Mike') DESC, StudentMarks

Thứ tự ưu tiên: John > David > Mike > Others.

Lưu ý

  • Không dùng index cho ORDER BY CASE/FIELD (filesort).
  • Phù hợp cho result set nhỏ/vừa, hoặc có LIMIT.