Có thể sắp xếp kết quả theo biểu thức tính toán từ nhiều cột bằng cách đặt biểu thức trong SELECT và dùng alias trong ORDER BY.
Cú pháp
SELECT (biểu_thức_tính_toán) AS alias_tính_toán FROM tên_bảng ORDER BY alias_tính_toán DESC|ASC;
Ví dụ minh họa
Tạo bảng demo:
mysql> CREATE TABLE orderByAFunctionDemo (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> FirstNumber INT,
-> SecondNumber INT
-> );
Query OK, 0 rows affected (0.44 sec)
Chèn dữ liệu:
mysql> INSERT INTO orderByAFunctionDemo(FirstNumber, SecondNumber) VALUES
-> (10, 4), (45, 78), (23, 10), (67, 237), (12, 90);
Xem dữ liệu:
mysql> SELECT * FROM orderByAFunctionDemo;
+----+-------------+--------------+ | Id | FirstNumber | SecondNumber | +----+-------------+--------------+ | 1 | 10 | 4 | | 2 | 45 | 78 | | 3 | 23 | 10 | | 4 | 67 | 237 | | 5 | 12 | 90 | +----+-------------+--------------+
Tính (4 × FirstNumber + 5 × SecondNumber) và sắp xếp giảm dần:
mysql> SELECT (4 * FirstNumber + 5 * SecondNumber) AS Calculation
-> FROM orderByAFunctionDemo
-> ORDER BY Calculation DESC;
+-------------+ | Calculation | +-------------+ | 1453 | -- 4×67 + 5×237 = 268 + 1185 | 570 | -- 4×45 + 5×78 = 180 + 390 | 498 | -- 4×23 + 5×10 = 92 + 50 | 142 | -- 4×12 + 5×90 = 48 + 450 | 60 | -- 4×10 + 5×4 = 40 + 20 +-------------+
Ứng dụng thực tế
- Điểm số có trọng số:
0.3*midterm + 0.7*final - Doanh thu:
quantity * unit_price * (1 - discount) - Khoảng cách:
SQRT(POW(x2-x1,2) + POW(y2-y1,2)) - Ưu tiên:
priority * 1000 + created_at
Lưu ý hiệu năng
Biểu thức trong ORDER BY không thể dùng index (filesort). Với bảng lớn, cân nhắc:
- Tạo generated column (MySQL 5.7+) có index
- Tính trước và lưu cột kết quả
- Giới hạn kết quả với LIMIT