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

Có thể chia bản ghi tăng/giảm và hiển thị xen kẽ trong MySQL không?

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 ASC là 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