[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка из диапазона
kasichvadim
Здравствуйте!

Есть таблица с двумя полями: min_sum и max_sum

Как составить запрос, чтобы выбирать все записи для заданого диапазона?



Спустя 28 минут, 51 секунда (27.05.2009 - 19:21) jetistyum написал(а):
а какие данные хранятся в этих полях, и в каком именно диапазоне нужно выбрать?

Спустя 12 минут, 31 секунда (27.05.2009 - 19:33) kasichvadim написал(а):
Допустим сдесь минимальная и максимальная стоимость путевки:

1. min_sum = 10 max_sum = 20
2. min_sum = 1 max_sum = 5

Мне нужно, к примеру, выбрать все путевки с ценой от 10 до 15 руб. В этом случае первая запись должна попасть в выборку.

Спустя 6 минут, 14 секунд (27.05.2009 - 19:39) jetistyum написал(а):
ты видимо хочешь по данным из выборки из одной таблицы сделать выборку из второй таблицы.
Тебя не затруднит привести структуру обоих таблиц.. и детальнее описать свой вопрос....
ты сам перечитай что ты пишешь? кто тебе сможет помочь?

Спустя 18 минут, 59 секунд (27.05.2009 - 19:58) waldicom написал(а):
BETWEEN

Спустя 7 минут, 4 секунды (27.05.2009 - 20:05) kasichvadim написал(а):
Согласен. Тупо объяснил )))

Вобщем все по-порядку:

Есть таблица table (id, name, max_sum, min_sum)

Она содержит информацию о базах отдыха: порядковый номер (id), название базы отдыха (name), минимальную суму проживания (min_sum), максимальную суму проживания (max_sum).

Допустим таблица table содержит следующие записи:


Код
id    name                         min_sum                    max_sum
-----------------------------------------------------------------------
1     База 1                       100                             200
2     База 2                       200                             500
3     База 3                       10                               20
.... и т.д.


Далее... есть некоторая форма поиска, где пользователь указывает минимальную и максимальную суму для поиска базы отдыха. В эту форму он вводит два числа: минимальную и максимальную суму проживания. Допустим пользователь хочет найти базу отдыха, стоимоть проживания в которой от 100 до 150 руб.

Вот как составить такой запрос в базу, чтобы найти базы отдыха соответствующие этому диапазону цен?

Фух... надеюсь немного понятнее объяснил )))

Спустя 18 минут, 52 секунды (27.05.2009 - 20:24) Kuliev написал(а):
kasichvadim
Попробуй так
SQL
SELECT min_sum, max_sum FROM table WHERE min_sum >= 10 AND max_sum <= 200


Спустя 12 минут, 51 секунда (27.05.2009 - 20:37) kasichvadim написал(а):
Цитата (Kuliev @ 27.05.2009 - 19:24)
kasichvadim
Попробуй так
SQL
SELECT min_sum, max_sum FROM table WHERE min_sum >= 10 AND max_sum <= 200

Ну типа такого я уже пробовал. Так не проходит...

Допустим
min_sum = 1
max_sum = 3


Делаем запрос с min_sum = 1, max_sum = 2

SQL
SELECT min_sum, max_sum FROM table WHERE min_sum >= 1 AND max_sum <= 2


В этом случае, запрос ничего не выберет через условие max_sum <= 2 (а у нас max_sum = 3)


Спустя 1 час, 9 минут, 30 секунд (27.05.2009 - 21:47) Grazor написал(а):
тогда так
SQL
SELECT min_sum, max_sum FROM table WHERE min_sum <= 1 AND max_sum >= 2


знаки наоборот. лучше это представить так
1 >= min_sum и 2 <= max_sum
где наши 1 и 2 - данные, полученные из формы. если прикинуть на оси, то они должны быть между min_sum и max_sum

ниже тому подтверждение

Спустя 2 часа, 15 минут, 32 секунды (28.05.2009 - 00:02) Alchemist написал(а):
Grazor, твой пример показывает только один из 4-х возможных случаев. Если юзер ввел промежуток 100-200, а у базы он 150-300, то такая база тоже должна попасть в выборку.

Подсказка: попробуй нарисовать все возможные варианты и поискать общие места. Решение действительно очень простое, но слегка неожиданное.

Спустя 6 часов, 39 минут, 51 секунда (28.05.2009 - 06:42) Grazor написал(а):
Alchemist
а должен ли такой случай быть выбран?
Цитата (kasichvadim @ 27.05.2009 - 20:05)
Допустим пользователь хочет найти базу отдыха, стоимоть проживания в которой от 100 до 150 руб.

Вот как составить такой запрос в базу, чтобы найти базы отдыха соответствующие этому диапазону цен?


я так понял, что мы смотрим, чтобы наш промежуток жестко входил в указанный диапазон

Спустя 1 час, 10 минут, 46 секунд (28.05.2009 - 07:53) Kuliev написал(а):
Цитата (Grazor @ 27.05.2009 - 23:47)
тогда так
SQL
SELECT min_sum, max_sum FROM table WHERE min_sum <= 1 AND max_sum >= 2


знаки наоборот. лучше это представить так
1 >= min_sum и 2 <= max_sum
где наши 1 и 2 - данные, полученные из формы. если прикинуть на оси, то они должны быть между min_sum и max_sum

ниже тому подтверждение

Будет аналогичный результат, что и в посте выше т.к. такого значения нет в max_sum выведет пустые строки.

Спустя 17 минут, 54 секунды (28.05.2009 - 08:11) kirik написал(а):
Цитата (Grazor @ 27.05.2009 - 22:42)
я так понял, что мы смотрим, чтобы наш промежуток жестко входил в указанный диапазон

В разработке приложений для веба нужно руководствоваться не тупой логикой if-else, а включить в себе пользователя. Если отдых на турбазе "Xyz" стоит от 100 до 200, а ты ввел 150-300, то подойдет-ли тебе такая турбаза? Ведь ты согласен потратить 200 у.е. за отдых? И турбаза с ценами от 200 до 500 тоже должна войти в список при твоем поиске "150-300".

Как сказал Alchemist, решение и правда неожиданное smile.gif

Спустя 48 минут, 30 секунд (28.05.2009 - 08:59) glock18 написал(а):
Надо смотреть, чтобы мин_базы был меньше, чем макс_пользователя ИЛИ (OR) макс_базы был больше мин_пользователя.

Типа... ввели 150-300
значит where будет (@min - введенный минимум, @max - введенный максимум):
SQL
WHERE (max_sum >= @min AND min_sum <= @min) OR (min_sum <= @max AND max_sum >= @max)


Или можно between использовать, как waldicom предложил:

SQL
WHERE (@min BETWEEN min_sum AND max_sum) OR (@max BETWEEN min_sum AND max_sum)

Спустя 9 минут, 12 секунд (28.05.2009 - 09:08) Kuliev написал(а):
Автору нужно реализовать другой подход к решению данной задачи, скажем что пользователь вводит только максимальную сумму которую он готов потратить на отдых, вследствие это должна быть выборка всех значений меньше или равно сумме которую ввел пользователь, как-то так!



Спустя 1 час, 3 минуты, 49 секунд (28.05.2009 - 10:12) kasichvadim написал(а):
Вот не думал, что все будет так сложно... Видимо точно нужно менять подход для реализации этой задачи.

Спустя 13 минут, 7 секунд (28.05.2009 - 10:25) Kuliev написал(а):
kasichvadim
Вот прям только что накидал
PHP
$sql = ("SELECT * FROM table WHERE max_sum <= '".$_POST['sum']."'  AND min_sum <= max_sum");


В общем то о чем я писал раньше, представь что ты пользователь в поиске турбазы, у тебя есть 100 баксов, ты пишешь в поле что готов потратить только 100 баксов на отдых, запрос тебе выдаст все турбазы стоимость которых не превышает 100 баксов, если юзер просто напросто набрал скажем 10р а такой цены в базе нет, то она вернет 0 срок соответственно нужно это проверять и отправлять пользователю ответ что по такому критерию турбазу он хр...н где найдет! biggrin.gif

Спустя 31 минута, 13 секунд (28.05.2009 - 10:57) sergeiss написал(а):
А я не понял... Вот этот ответ чем не понравился?
Цитата (glock18 @ 28.05.2009 - 09:59)
Типа... ввели 150-300
значит where будет (@min - введенный минимум, @max - введенный максимум):
SQL
WHERE (max_sum >= @min AND min_sum <= @min) OR (min_sum <= @max AND max_sum >= @max)


Или можно between использовать, как waldicom предложил:
SQL
WHERE (@min BETWEEN min_sum AND max_sum) OR (@max BETWEEN min_sum AND max_sum)


Тут находим, что или нижняя, или верхняя граница запроса попала в диапазон. Вроде бы самое подходящее решение. Охватывает практически все возможные случаи, могущие быть интересными.

Спустя 34 минуты, 4 секунды (28.05.2009 - 11:31) Kuliev написал(а):
sergeiss
Цитата

Тут находим, что или нижняя, или верхняя граница запроса попала в диапазон. Вроде бы самое подходящее решение. Охватывает практически все возможные случаи, могущие быть интересными.

Так-то да. Хотя я может не понял, что именно нужно автору, точнее что он хочет увидеть в итоге.

Вот таблица к примеру

Код

min  |  max |
---------------
100  | 500   |
---------------
200  | 800   |
---------------
250  | 950   |
---------------
300  | 1200 |
---------------
500  | 1800 |
---------------
700  | 2500 |
---------------
350  | 1550 |
---------------
450  | 6000 |
---------------



Теперь делаем запрос

SQL
SELECT * FROM table WHERE (100 BETWEEN min_sum AND max_sum) OR (1500 BETWEEN min_sum AND max_sum)


В итоге мы получим

Код

min  |  max |
---------------
100  | 500   |
---------------
500  | 1800 |
---------------
700  | 2500 |
---------------
350  | 1550 |
---------------
450  | 6000 |
---------------


Если сделать как в моем примере то результат таков
SQL
SELECT * FROM table WHERE max <= 1500 AND min <= max


Код

min  |  max |
---------------
100  | 500   |
---------------
200  | 800   |
---------------
250  | 950   |
---------------
300  | 1200 |
---------------



Что конкретно нужно автору пусть выбирает сам, какой критерий отбора ему приемлем. ph34r.gif

Спустя 10 часов, 40 минут, 12 секунд (28.05.2009 - 22:11) Alchemist написал(а):
kasichvadim, успокойся, ничего менять не нужно... кроме может быть взгляда на задачу....

Решение glock18'a охватывает 3 из 4-х возможных вариантов. Остается неохваченым вариант когда юзер заказал 100-400, а база стоит 200-300.

Ребят, еще раз предлагаю: нарисуйте все 4 (четыре) возможных варианта на бумаге и попробуйте найти общие места. Решение очень простое - два условия с одним AND.

Я подобную задачу решал 6 лет назад на одном из первых своих сайтов...

Спустя 15 минут, 38 секунд (28.05.2009 - 22:26) sergeiss написал(а):
Ежели 2 условия с одним ЭНД... Это получается, что
1. Верхняя граница запроса пользователя выше нижней границы предложения фирмы, И
2. Нижняя граница запроса пользователя ниже верхней границы предложения фирмы.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.