Giải pháp: ORDER BY biểu thức tính toán
Tính hiệu (Value1 - Value2) trong SELECT, đặt alias, dùng trong ORDER BY.
Ví dụ minh họa
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (Value1 INT, Value2 INT); mysql> INSERT INTO DemoTable VALUES(10, 40), (50, 5), (51, 56), (52, 78), (90, 7);
Dữ liệu gốc
+--------+--------+ | Value1 | Value2 | +--------+--------+ | 10 | 40 | | 50 | 5 | | 51 | 56 | | 52 | 78 | | 90 | 7 | +--------+--------+
Truy vấn: Hiệu Value1 - Value2, sắp giảm dần
mysql> SELECT (Value1 - Value2) AS Sub
-> FROM DemoTable
-> ORDER BY Sub DESC;
Kết quả
+------+ | Sub | +------+ | 83 | <-- 90 - 7 | 45 | <-- 50 - 5 | -5 | <-- 51 - 56 | -26 | <-- 52 - 78 | -30 | <-- 10 - 40 +------+
Mở rộng: Giữ cả cột gốc
SELECT Value1, Value2, (Value1 - Value2) AS Difference FROM DemoTable ORDER BY Difference DESC;
Kết quả
+--------+--------+------------+ | Value1 | Value2 | Difference | +--------+--------+------------+ | 90 | 7 | 83 | | 50 | 5 | 45 | | 51 | 56 | -5 | | 52 | 78 | -26 | | 10 | 40 | -30 | +--------+--------+------------+
Sắp xếp theo giá trị tuyệt đối
ORDER BY ABS(Value1 - Value2) DESC;
Kết quả
+------------+ | ABS(Diff) | +------------+ | 83 | | 45 | | 30 | | 26 | | 5 | +------------+
Ứng dụng thực tế
- Chênh lệch giá:
sale_price - cost_price - Độ lệch dự báo:
actual - predicted - Chênh lệch điểm:
score1 - score2
Lưu ý
- Alias trong ORDER BY được hỗ trợ MySQL (không phải tất cả DB)
- Có thể ORDER BY vị trí:
ORDER BY 3 DESC(cột thứ 3) - NULL trong phép tính → kết quả NULL → xếp cuối (ASC) hoặc đầu (DESC)