I.Giới thiệu:

  • Trong ngôn ngữ MySQL việc sắp xếp theo thứ tự số từ lớn đến nhỏ, hoặc chuỗi theo thứ tự alphabet, ngày tháng...
  • Tuy nhiên trong 1 số trường hợp "khó khăn" khách hàng có thể yêu cầu hơi phi logic, ví dụ như bình thường chúng ta sẽ sắp xếp các list các tỉnh thành theo alphabet tuy nhiên khách hàng đôi khi lại muốn  đưa 1 số thành phố phổ biến lên đầu.
  • Như vậy lúc này chúng ta không còn sắp xếp theo số hoặc chuỗi mà sẽ là sắp xếp theo ý khách hàng.

II. Hướng dẫn:

  • Đầu tiên tạo dữ liệu mẫu.
create table user_log (id int NOT NULL AUTO_INCREMENT PRIMARY KEY,email varchar(100));
insert into user_log(email) values('user1@email.com');
insert into user_log(email) values('user2@email.com');
insert into user_log(email) values('user3@email.com');
insert into user_log(email) values('user4@email.com');
insert into user_log(email) values('user5@email.com');
  • Select dữ liệu mẫu.
select * from user_log
  • Hiện tại đang order theo id từ nhỏ đến lớn.
  • Mình sẽ sắp xếp theo 1 thứ tự do mình đặt ra theo ID là "3,2,4,5,1" và dùng hàm FIELD trong Mysql.
select *
from user_log
order by FIELD(id, 3,2,4,5,1)
  • Hàm FIELD sẽ tìm vị trí của id trong chuỗi sắp xếp, giống như tìm giá trị trong mảng trả về vị trí index, tuy nhiên phần tử đầu tiên sẽ bắt đầu bằng 1. Để dễ hiểu hơn chạy câu MySQL dưới đây, và đây cũng là cách thứ 2:
select *, FIELD(id, 3,2,4,5,1) as sort_number
from user_log
order by sort_number

III. Kết luận:

  • Khi nhận được những yêu cầu sắp xếp theo 1 thứ tự "không logic", mình có thử xử lý trong mảng (sau khi đã query xong thành mảng), tuy nhiên cách này không hợp lý nếu trong câu MySQL có phân trang. Cách này hiển thị đúng ngay cả khi có phân trang nên mình nghĩ đây là giải pháp tốt.