Có, có thể thực hiện bằng cách tính giá trị trung gian (middle value) và sắp xếp với biểu thức điều kiện.
Tạo bảng và chèn 10 bản ghi
mysql> CREATE TABLE DemoTable (UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
mysql> INSERT INTO DemoTable VALUES(), (), (), (), (), (), (), (), (), ();
Xem dữ liệu (ID 1-10)
+--------+ | UserId | +--------+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 | +--------+
Bước 1: Tính giá trị trung bình
mysql> SET @middleValue = (SELECT MAX(UserId) FROM DemoTable) / 2;
Query OK, 0 rows affected (0.01 sec)
Với ID 1-10, MAX=10, @middleValue = 5
Bước 2: Sắp xếp xen kẽ tăng/giảm
mysql> SELECT * FROM DemoTable
-> ORDER BY (IF(UserId < @middleValue, @middleValue*2 - UserId, UserId-1)) DESC, UserId ASC;
+--------+ | UserId | +--------+ | 1 | | 10 | | 2 | | 9 | | 3 | | 8 | | 4 | | 7 | | 6 | | 5 | +--------+
Giải thích logic sắp xếp
- Với UserId < 5: Giá trị sắp xếp = 10 - UserId (1→9, 2→8, 3→7, 4→6)
- Với UserId ≥ 5: Giá trị sắp xếp = UserId - 1 (5→4, 6→5, 7→6, 8→7, 9→8, 10→9)
- Sắp xếp DESC theo giá trị này tạo ra thứ tự: 1, 10, 2, 9, 3, 8, 4, 7, 6, 5
UserId ASClà tie-breaker cho các giá trị bằng nhau
Ứng dụng thực tế
Kỹ thuật này hữu ích khi cần trình bày dữ liệu theo mẫu "đầu-cuối, thứ hai-cuối thứ hai..." như:
- Ghép đôi đối thủ trong giải đấu (seed 1 vs seed N, seed 2 vs seed N-1...)
- Hiển thị sản phẩm: mới nhất, cũ nhất, mới thứ 2, cũ thứ 2...
- Phân phối tải cân bằng