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). UNIONloại bỏ trùng lặp (không có trong ví dụ này). DùngUNION 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;