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

Tìm bản ghi gần giá trị nhất với biến user-defined trong MySQL

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.