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

Sắp xếp kết quả theo thứ tự ID chỉ định với FIND_IN_SET trong MySQL

Giới thiệu

Khi cần kết quả truy vấn theo thứ tự ID cụ thể (không phải ASC/DESC), dùng ORDER BY FIND_IN_SET(Id, 'danh_sách_ID').

1. Tạo bảng và dữ liệu

mysql> create table DemoTable1563 (
    -> StudentId int,
    -> StudentName varchar(20)
    -> ); 
Query OK, 0 rows affected (0.52 sec)

mysql> insert into DemoTable1563 values(1001,'Chris'); 
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1563 values(1010,'Bob'); 
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1563 values(1005,'Chris'); 
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable1563 values(1015,'David'); 
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1563 values(1030,'Mike'); 
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1563 values(1020,'Sam'); 
Query OK, 1 row affected (0.14 sec)

2. Dữ liệu gốc

mysql> select * from DemoTable1563;
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|      1001 | Chris       |
|      1010 | Bob         |
|      1005 | Chris       |
|      1015 | David       |
|      1030 | Mike        |
|      1020 | Sam         |
+-----------+-------------+
6 rows in set (0.00 sec)

3. Truy vấn sắp xếp theo thứ tự: 1001, 1030, 1010, 1020

mysql> select * from DemoTable1563
    -> where StudentId IN(1001,1030,1010,1020)
    -> order by find_in_set(StudentId, '1001,1030,1010,1020');

4. Kết quả

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|      1001 | Chris       |
|      1030 | Mike        |
|      1010 | Bob         |
|      1020 | Sam         |
+-----------+-------------+
4 rows in set (0.00 sec)

Cách hoạt động: FIND_IN_SET trả về vị trí (1-based) của StudentId trong chuỗi danh sách. ORDER BY sắp xếp theo số vị trí này.

So sánh với ORDER BY CASE:

  • FIND_IN_SET: Ngắn gọn, dễ đọc, nhưng chậm (hàm, không dùng index)
  • ORDER BY CASE: Nhanh hơn, có thể dùng index nếu tối ưu
  • ORDER BY FIELD(StudentId, 1001,1030,1010,1020): Tốt nhất (MySQL native, nhanh, ngắn gọn)

Khuyên dùng FIELD() cho MySQL 5.7+.