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

Sắp xếp theo hàm của hai cột trong một truy vấn MySQL

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