Tìm giá trị gần nhất (nearest) trong MySQL dùng ABS() và biến
Kết hợp biến user-defined lưu giá trị mục tiêu, hàm ABS() (giá trị tuyệt đối), ORDER BY và LIMIT 1 để tìm bản ghi có giá trị gần nhất.
1. Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
CustomerId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ProductAmount INT
);
mysql> INSERT INTO DemoTable (ProductAmount) VALUES (5000), (6000), (7000);
2. Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+------------+---------------+ | CustomerId | ProductAmount | +------------+---------------+ | 1 | 5000 | | 2 | 6000 | | 3 | 7000 | +------------+---------------+
3. Thiết lập giá trị mục tiêu và truy vấn
mysql> SET @value = 6990;
mysql> SELECT ProductAmount FROM DemoTable
ORDER BY ABS(ProductAmount - @value) LIMIT 1;
4. Kết quả
+---------------+ | ProductAmount | +---------------+ | 7000 | +---------------+
Phân tích khoảng cách:
- |5000 - 6990| = 1990
- |6000 - 6990| = 990
- |7000 - 6990| = 10 ← Nhỏ nhất
Mở rộng - Trả về cả CustomerId:
SELECT CustomerId, ProductAmount FROM DemoTable ORDER BY ABS(ProductAmount - @value) LIMIT 1;
Tìm nhiều giá trị gần nhất (Top N):
SELECT ProductAmount FROM DemoTable ORDER BY ABS(ProductAmount - @value) LIMIT 3;
Ứng dụng: Tìm sản phẩm giá gần ngân sách, tìm user điểm số gần mục tiêu, tìm ngày gần deadline, v.v.
Lưu ý: Không dùng index do biểu thức ABS(col - @var). Với bảng lớn, cân nhắc range query: WHERE ProductAmount BETWEEN @value - 100 AND @value + 100 rồi ORDER BY trong ứng dụng.