@NewTypes
На себя

Как составить SQL запрос для поиска значений, входящих в диапазон чисел?

Здравствуйте.

Имею таблицу:

+======+======+
| one | two |
+=============+
| 10 | 30 |
+-------------+
| 30 | 100 |
+-------------+
| 100 | 200 |
+-------------+
| 200 | 400 |
+-------------+
| 405 | 2000|
+-------------+
| 10 | 180 |
+-------------+

Как получить пересекающиея значения с:

one = 90
two = 220

Я имею ввиду результат в виде:

+======+======+
| one | two |
+=============+
| 30 | 100 |
+-------------+
| 100 | 200 |
+-------------+
| 200 | 400 |
+-------------+
| 10 | 180 |
+-------------+

Например, 100 > 90(one), но 100 < 220 (two). То есть строка [100|200] входит в диапазон [90|220] целиком
Или 10 < 90 (one), а 180 < 220 (two), однако часть все равно входит в диапазон (90|180)

Чтобы получить ТОЛЬКО входящие в диапазон (как в варианте 100|200), достаточно просто:

SELECT *
FROM table
WHERE one <= 90
AND two >= 220

А каким образом я могу получить все входящие диапазоны в данный?
  • Вопрос задан
  • 21623 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT * FROM `table`
    WHERE `one` BETWEEN {$start} AND {$end} 
        OR {$start} BETWEEN `one` AND `two`
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@ADv1S
SELECT *
FROM table
WHERE (one >= 90 and one <=220)
OR (two >= 90 and two <=220)
Ответ написан
Комментировать
У меня получилось так
select * from table where 
(one>= 90 AND two > 90 AND one < 220 ) OR
(two> 90 AND one < 90) OR
(one < 220 AND two>220)
Ответ написан
Комментировать
@kirillzorin
set @one := 90;
set @two := 220;
select * from tabl
where greatest(one, @one) <= least(two, @two);
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы