MySQL: Как написать запрос который ищет ближайшее по условию значение?

Есть такая таблица

Количество |Вес| Цена

1 | 0,1 | 180

2 | 0,6 | 200

3 | 1,2 | 250

5 | 2 | 300


как написать запрос который выберет строку с НАИБОЛЬШИМ ближайшим к указанному значением колонки Количество например:

Количество = 4


Оно лежит между 3 и 5. Нужно выбрать наибольшее КОЛИЧЕСТВО из 3 и 5 т.е. запрос должен вернуть строчку:

5 | 2 | 300


P.s. Большими буквами писал ключевые моменты чтоб обратить внимание
  • Вопрос задан
  • 8614 просмотров
Решения вопроса 1
@ztxn
>>НАИБОЛЬШИМ ближайшим

where количество >: запрошенное_количество
order by количество limit 1
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
miraage
@miraage
Старый прогер
mysql> select * from test1;
+----+-------+--------+-------+
| id | count | weight | price |
+----+-------+--------+-------+
|  1 |     1 |    0.1 |   100 |
|  2 |     2 |    0.6 |   200 |
|  3 |     3 |    1.2 |   250 |
|  4 |     5 |      2 |   300 |
+----+-------+--------+-------+
4 rows in set (0.00 sec)

mysql> select * from test1 having (count-4)>=0 order by count desc limit 1;
+----+-------+--------+-------+
| id | count | weight | price |
+----+-------+--------+-------+
|  4 |     5 |      2 |   300 |
+----+-------+--------+-------+
1 row in set (0.00 sec)
Ответ написан
Ramzeska
@Ramzeska
Тогда вообще вот так:
(SELECT * FROM `good` WHERE qty >= 4 ORDER BY qty LIMIT 1)
UNION ALL
(SELECT * FROM `good` WHERE qty < 4 ORDER BY qty DESC LIMIT 1)
LIMIT 1

Спасибо что про union all подсказали — я уж и забыл что это как distinct работает.
Ответ написан
Ramzeska
@Ramzeska
SELECT * FROM (SELECT * FROM `good` WHERE qty >= 4 ORDER BY qty >= 4, qty LIMIT 1) as g
UNION 
SELECT * FROM (SELECT * FROM `good` WHERE qty < 4 ORDER BY qty < 4, qty DESC LIMIT 1) as g

Выбираете всегда первую строчку и это будет наибольшим ближайшим от 4. Если нет большего — вернется ближайший меньший от 4.
Ответ написан
@yupic
Недавно решал похожую задачу в Access. У меня было две таблицы: таблица сделок, в которой был столбец с временем сделки, и таблица цен с колонками товар, время начала действия цены и цена.
Надо было определить по какой цене были произведены сделки. В обеих таблицах было очень много строк.
Перепробовал кучу вариантов: с подзапросами, промежуточными таблицами и пр. Но все они работали очень долго, так как для каждой строки из таблицы сделок надо было выполнять подзапрос с LIMIT 1.
В итоге самым быстрым оказалось такое решение: получить две таблицы, отсортировав их по времени, далее в цикле одновременно обходить обе таблицы и выполнять пересечение вручную.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы