Sắp xếp ưu tiên giá trị > 0, giá trị = 0 xuống cuối trong MySQL
Sử dụng biểu thức boolean Value = 0 trong ORDER BY: FALSE (0) sắp trước TRUE (1), nên giá trị > 0 lên đầu, 0 xuống cuối.
Cú pháp
SELECT * FROM yourTable ORDER BY (Value = 0), Value;
Ví dụ minh họa
Tạo bảng:
mysql> CREATE TABLE gettingAndOrderingRowsDemo (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Value INT
-> );
Chèn dữ liệu có giá trị 0 và > 0:
mysql> INSERT INTO gettingAndOrderingRowsDemo(Value) VALUES (10), (13), (0), (20), (30), (60), (0), (45), (0);
Dữ liệu gốc:
+----+-------+ | Id | Value | +----+-------+ | 1 | 10 | | 2 | 13 | | 3 | 0 | | 4 | 20 | | 5 | 30 | | 6 | 60 | | 7 | 0 | | 8 | 45 | | 9 | 0 | +----+-------+
Sắp xếp: Giá trị > 0 trước (tăng dần), 0 sau:
mysql> SELECT * FROM gettingAndOrderingRowsDemo ORDER BY Value = 0, Value;
Kết quả:
+----+-------+ | Id | Value | +----+-------+ | 1 | 10 | | 2 | 13 | | 4 | 20 | | 5 | 30 | | 8 | 45 | | 6 | 60 | | 3 | 0 | | 7 | 0 | | 9 | 0 | +----+-------+
Giải thích cơ chế
Value = 0trả về 1 (TRUE) nếu Value = 0, ngược lại 0 (FALSE)- MySQL sắp xếp số: 0 (FALSE) trước, 1 (TRUE) sau
- → Hàng Value > 0 (FALSE=0) lên đầu, hàng Value = 0 (TRUE=1) xuống cuối
, Valuethứ 2 sắp xếp tăng dần trong nhóm > 0
Các biến thể
- Giảm dần cho > 0:
ORDER BY Value = 0, Value DESC - Giá trị âm lên đầu:
ORDER BY Value < 0 DESC, Value = 0, Value - NULL lên đầu:
ORDER BY Value IS NULL DESC, Value = 0, Value - CASE WHEN (rõ ràng hơn):
ORDER BY CASE WHEN Value > 0 THEN 1 WHEN Value = 0 THEN 2 ELSE 3 END, Value
Lưu ý
- Kỹ thuật này không dùng index cho ORDER BY
- Phù hợp cho tập kết quả vừa/vài nghìn hàng
- Với bảng lớn: cân nhắc thêm cột flag
is_zero TINYINTcó index