1

我试图在 mySQL 中找出一种方法来将数字与数字列表进行比较,以找到最接近它的数字。

所以本质上,如果我有数字 5 和数字列表 7、8、9、2、1,答案将是 7。

有人对如何做到这一点有任何想法吗?

谢谢

这就是我需要的。当我提供我所在的当前车站 ID 和我正在寻找的服务时,我试图找到最近的具有特定服务的车站。

这是我的存储过程的代码:

    DROP PROCEDURE IF EXISTS nearest;
    DELIMITER //
    CREATE PROCEDURE nearest
    (
        IN serviceIn VARCHAR(20), IN stationid INT
    )
    BEGIN
        SELECT station_id
        FROM station
        WHERE ABS(station_id - stationid) = (SELECT MIN(ABS(station_id - stationid))
        FROM station) AND service = serviceIn;
    END //
    DELIMITER ;
4

1 回答 1

2

你可以这样做:

SELECT number
FROM tablename
ORDER BY  ABS(number - 5) 
LIMIT 1;

看到它在行动


但这将始终只返回一个数字,但如果有重复的数字与相同的数字接近,它只会得到其中一个。例如,如果您的列表中有数字 3,在这种情况下应该返回两个数字 7 和 3,之前的查询将只返回其中一个。

对于这种情况,试试这个:

SELECT number
FROM tablename
WHERE ABS(number - 5) = (SELECT MIN(ABS(number - 5))
                         FROM tablename);

看看它的实际效果:


更新:

您还需要将条件 `` 添加到子查询中,以便您的存储过程应如下所示:

DROP PROCEDURE IF EXISTS nearest;

CREATE PROCEDURE nearest
(
  IN serviceIn VARCHAR(20), IN stationid INT
)
BEGIN
  SELECT station_id
  FROM station
  WHERE ABS(station_id - stationid) = (SELECT MIN(ABS(station_id - stationid))
                                       FROM station
                                       WHERE service = serviceIn) AND service = serviceIn;
END 

更新的 SQL Fiddle 演示

于 2013-04-06T20:35:10.597 回答