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

Chọn giá trị bằng hoặc gần nhất lớn hơn từ bảng trong MySQL

Để tìm hàng có giá trị **bằng hoặc lớn nhất gần nhất** so với một ngưỡng (target), sắp xếp theo **khoảng cách tuyệt đối** rồi theo **giá trị giảm dần**, lấy 1 hàng đầu.

Kỹ thuật: ORDER BY ABS(cot - target), cot DESC LIMIT 1

  • ABS(Value - 50): khoảng cách tuyệt đối đến 50.
  • Value DESC: nếu cùng khoảng cách, ưu tiên giá trị **lớn hơn** (lớn hơn hoặc bằng target).
  • LIMIT 1: lấy 1 hàng đầu.

Ví dụ minh họa

mysql> CREATE TABLE DemoTable (Value INT);
mysql> INSERT INTO DemoTable VALUES (25), (75), (100);

Tìm giá trị ≥ 50 gần nhất (target = 50):

mysql> SELECT * FROM DemoTable
    -> ORDER BY ABS(Value - 50), Value DESC
    -> LIMIT 1;

Kết quả: 75 (khoảng cách 25, lớn hơn 50).

+-------+
| Value |
+-------+
|    75 |
+-------+

Giải thích

ValueABS(Value-50)Giải thích
2525Khoảng cách 25, nhưng < 50
7525Khoảng cách 25, > 50 → ưu tiên (DESC)
10050Khoảng cách 50

Trường hợp có giá trị bằng chính xác

Nếu có Value = 50: ABS(50-50)=0 → nhỏ nhất → được chọn (bằng target).

Mở rộng: Tìm gần nhất nhỏ hơn hoặc bằng (≤ target)

SELECT * FROM bang
WHERE cot <= target
ORDER BY cot DESC
LIMIT 1;

Mở rộng: Tìm gần nhất lớn hơn (strictly > target)

SELECT * FROM bang
WHERE cot > target
ORDER BY cot ASC
LIMIT 1;

⚠️ Hiệu năng

Biểu thức ABS(cot - target) không dùng được index. Với bảng lớn, dùng cách mở rộng có WHERE + index trên cột.