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ồiStudentMarksASC.
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.