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

Truy vấn MySQL sắp xếp: giá trị âm giảm dần, sau đó giá trị dương tăng dần

Sử dụng UNION để kết hợp các tập kết quả với thứ tự sắp xếp khác nhau.

Tạo bảng demo

mysql> create table DemoTable (
    -> Number int
    -> );
Query OK, 0 rows affected (1.17 sec)

Chèn dữ liệu có cả âm, dương, và 0

mysql> insert into DemoTable values(10);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values(100);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(-9);
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable values(-190);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values(190);
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable values(0);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values(140);
Query OK, 1 row affected (0.16 sec)

Hiển thị dữ liệu gốc

mysql> select * from DemoTable;

Kết quả

+--------+
| Number |
+--------+
| 10     |
| 100    |
| -9     |
| -190   |
| 190    |
| 0      |
| 140    |
+--------+
7 rows in set (0.00 sec)

Truy vấn: 0 trước, rồi âm giảm dần, rồi dương tăng dần

mysql> (select * from DemoTable where Number = 0)
    -> union
    -> (select * from DemoTable where Number < 0 order by Number desc)
    -> union
    -> (select * from DemoTable where Number > 0 order by Number);

Kết quả

+--------+
| Number |
+--------+
| 0      |
| -9     |
| -190   |
| 10     |
| 100    |
| 190    |
| 140    |
+--------+
7 rows in set (0.03 sec)

Giải thích:

  • Phần 1: Number = 0 → 0 lên đầu.
  • Phần 2: Number < 0 ORDER BY Number DESC → -9, -190 (giảm dần: -9 > -190).
  • Phần 3: Number > 0 ORDER BY Number → 10, 100, 140, 190 (tăng dần).
  • UNION loại bỏ trùng lặp (không có trong ví dụ này). Dùng UNION ALL để giữ trùng lặp và nhanh hơn.

Cách thay thế dùng CASE trong ORDER BY (một câu query):

SELECT * FROM DemoTable
ORDER BY 
  CASE 
    WHEN Number = 0 THEN 1
    WHEN Number < 0 THEN 2
    ELSE 3
  END,
  CASE WHEN Number < 0 THEN -Number ELSE Number END;