Как составить несложный запрос?

Что то видать жара в центральной части сильно на мозг «давит». Вроде простая задача но даже не знаю с какой стороны подходить…

Есть таблица в которой хранятся промежутки ЗНАЧЕНИЯ и цена:

От | До | Цена
0 | 5 | 100
6 | 10 | 200
11| 20 | 300
и т.д.

Условия таковы что в таблицы не будет пересекающихся промежутков

Задача: Как выбрать ряд, в котором ЗНАЧЕНИЕ будет в промежутки больше ОТ и меньше или равняться ДО

Вроде звучит просто НО как-то не складывается у меня
  • Вопрос задан
  • 2331 просмотр
Решения вопроса 1
ServDev
@ServDev
SELECT `price` FROM  `table` WHERE `from`< 'value' AND `to`>='value' 

получите 1 запись если нетупересекающихся промежутков
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@Vampiro
Первый способ тоже годится, но фактически для непересекающихся множеств можно пользоваться только одной границей.

CREATE TABLE IF NOT EXISTS `test1` (
  `minVal` int(11) NOT NULL,
  `maxVal` int(11) NOT NULL,
  `price` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`price`),
  UNIQUE KEY `froms` (`minVal`),
  UNIQUE KEY `fr2` (`minVal`,`maxVal`)
) ENGINE=MyISAM;


заполним ее значениями для 100к множеств с шагом 5 (0..4,5..9,… ,100000..100005)
EXPLAIN SELECT * 
FROM  `test1` 
WHERE minval <=42000
ORDER BY minval DESC 
LIMIT 1


id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE test1 range froms,fr2 fr2 4 NULL 9396 Using where

EXPLAIN SELECT * 
FROM  `test1` 
WHERE minval <=42000
AND maxval >=42000


id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE test1 ALL froms,fr2 NULL NULL NULL 20001 Using where

Имеющий глаза — да увидит.
Ответ написан
@Tr1aL
Самое правильное будет использовать
SELECT a FROM b WHERE c BETWEEN value1 AND value2
Ответ написан
Комментировать
la0
@la0
select * from tbl where ЗНАЧЕНИЕ >2 and ЗНАЧЕНИЕ <=10
чуть поподробнее пожалуйста. По тексту не очень понятно, что именно вы хотите получить.
Ответ написан
Комментировать
@artishok
кратко
SELECT * FROM таблица WHERE значени > ОТ AND значение <= ДО
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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