Giới thiệu
Dùng biểu thức boolean (Id = 101) trong ORDER BY để đẩy hàng có Id=101 lên đầu, các hàng khác giữ nguyên thứ tự tự nhiên.
1. Tạo bảng và dữ liệu
mysql> create table DemoTable (
-> Id int,
-> Name varchar(20)
-> );
Query OK, 0 rows affected (0.82 sec)
mysql> insert into DemoTable values(201,'Chris Brown');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values(110,'John Doe');
Query OK, 1 row affected (0.29 sec)
mysql> insert into DemoTable values(101,'Adam Smith');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values(345,'Carol Taylor');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values(135,'John Smith');
Query OK, 1 row affected (0.11 sec)
2. Dữ liệu gốc (theo thứ tự chèn)
mysql> select *from DemoTable;
+------+--------------+ | Id | Name | +------+--------------+ | 201 | Chris Brown | | 110 | John Doe | | 101 | Adam Smith | | 345 | Carol Taylor | | 135 | John Smith | +------+--------------+ 5 rows in set (0.00 sec)
3. Đẩy Id=101 lên đầu
mysql> select *from DemoTable
-> order by (Id=101) desc;
Cơ chế:
(Id=101)trả về 1 (TRUE) cho hàng Id=101, 0 (FALSE) cho các hàng khácDESC: 1 > 0 → hàng TRUE lên đầu- Các hàng FALSE (0) giữ thứ tự tương đối (stable sort trong MySQL)
4. Kết quả
+------+--------------+ | Id | Name | +------+--------------+ | 101 | Adam Smith | | 201 | Chris Brown | | 110 | John Doe | | 345 | Carol Taylor | | 135 | John Smith | +------+--------------+ 5 rows in set (0.00 sec)
Mở rộng: Ưu tiên nhiều giá trị theo thứ tự
ORDER BY (Id=101) DESC, (Id=110) DESC, (Id=201) DESC
Hoặc dùng FIELD():
ORDER BY FIELD(Id, 101, 110, 201) DESC -- FIELD trả về vị trí, 0 nếu không có
Ứng dụng: Hiển thị sản phẩm nổi bật, pinned post, tài khoản VIP lên đầu danh sách.