Выберите ближайшее значение из таблицы с помощью запроса MySQL - PullRequest
1 голос
/ 22 сентября 2019

У меня есть таблица, содержащая некоторые значения со столбцом max_value

max_value     
    100            
    250            
    320           
    160  

Поэтому я хочу выбрать значение, наиболее близкое к max_value, проверив несколько перечисленных ниже условий:

1) если у меня есть значение 111, то оно должно получить только max_value = 160

2) если у меня есть значение = 450, то оно должно получить max_value = 320

3), если у меня есть значение = 350тогда он должен получить 320, потому что нет значения больше, чем 350, поэтому он должен получить свое ближайшее нижнее значение

Запрос Mysql:

SELECT * FROM `table` 
where max_value <='450' or max_value >='450' 
ORDER BY max_value ASC LIMIT 1.

Ответы [ 2 ]

2 голосов
/ 22 сентября 2019

Один из способов - создать абсолютную разницу между входным значением и максимальным значением, а затем отсортировать по этому значению, чтобы получить строку с наименьшей абсолютной разницей.Но это будет самое близкое значение, будь то выше или ниже входного числа.Однако ваши пересмотренные требования предполагают, что если есть значение чуть выше входного значения, то вы бы предпочли это вместо этого.

SELECT max_value 
FROM your_table 
ORDER BY 
  -- give first priority to values above 450
  CASE WHEN max_value >= 450 THEN 1 ELSE 2 END ASC
  ABS(450 - max_value) ASC 
LIMIT 1

Но тогда, к сожалению, вышеупомянутый подход не может использовать индексирование,и будет медленно на большом столе.Таким образом, чтобы использовать индекс для столбца max_value, мы можем использовать UNION для двух разных запросов SELECT, достигая ближайшего значения чуть выше 450 и чуть ниже 450. Так что попробуйте следующее:

SELECT dt.max_value FROM 
(
  (
    -- getting the closest value just above 450
    SELECT max_value, 1 AS priority
    FROM your_table 
    WHERE max_value >= 450   -- notice >=
    ORDER BY max_value ASC   -- ASC LIMIT 1 to get value just above
    LIMIT 1
  )

  UNION 

  (
    -- getting the closest value just below 450
    SELECT max_value, 2 
    FROM your_table 
    WHERE max_value <= 450    -- notice <=
    ORDER BY max_value DESC   -- DESC LIMIT 1 to get value just below
    LIMIT 1
  ) 
) dt 

-- first priority to get the closest value above, then only below
ORDER BY dt.priority ASC 
1 голос
/ 22 сентября 2019

Вы можете использовать подзапрос, который возвращает минимальное значение max_value, которое на больше или равно искомому значению, или, если оно не существует, максимальное значение max_value, равное меньше до этого значения:

select * from tablename
where max_value = coalesce(
  (select min(max_value) from tablename where max_value >= 350),  
  (select max(max_value) from tablename where max_value < 350)
)

См. demo .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...