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

Truy vấn MySQL sắp xếp hàng có giá trị lớn hơn 0 lên đầu?

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 = 0 trả 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
  • , Value thứ 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 TINYINT có index