Để 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
| Value | ABS(Value-50) | Giải thích |
|---|---|---|
| 25 | 25 | Khoảng cách 25, nhưng < 50 |
| 75 | 25 | Khoảng cách 25, > 50 → ưu tiên (DESC) |
| 100 | 50 | Khoả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.