Есть таблица с двумя полями: 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 руб. В этом случае первая запись должна попасть в выборку.
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 содержит следующие записи:
Вобщем все по-порядку:
Есть таблица 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 Попробуй так
|
Ну типа такого я уже пробовал. Так не проходит...
Допустим
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) | ||
тогда так
знаки наоборот. лучше это представить так 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, решение и правда неожиданное
Спустя 48 минут, 30 секунд (28.05.2009 - 08:59) glock18 написал(а):
Надо смотреть, чтобы мин_базы был меньше, чем макс_пользователя ИЛИ (OR) макс_базы был больше мин_пользователя.
Типа... ввели 150-300
значит where будет (@min - введенный минимум, @max - введенный максимум):
Типа... ввели 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 срок соответственно нужно это проверять и отправлять пользователю ответ что по такому критерию турбазу он хр...н где найдет!
Спустя 31 минута, 13 секунд (28.05.2009 - 10:57) sergeiss написал(а):
А я не понял... Вот этот ответ чем не понравился?
Цитата (glock18 @ 28.05.2009 - 09:59) | ||||
Типа... ввели 150-300 значит where будет (@min - введенный минимум, @max - введенный максимум):
Или можно between использовать, как waldicom предложил:
|
Тут находим, что или нижняя, или верхняя граница запроса попала в диапазон. Вроде бы самое подходящее решение. Охватывает практически все возможные случаи, могущие быть интересными.
Спустя 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 | --------------- |
Что конкретно нужно автору пусть выбирает сам, какой критерий отбора ему приемлем.
Спустя 10 часов, 40 минут, 12 секунд (28.05.2009 - 22:11) Alchemist написал(а):
kasichvadim, успокойся, ничего менять не нужно... кроме может быть взгляда на задачу....
Решение glock18'a охватывает 3 из 4-х возможных вариантов. Остается неохваченым вариант когда юзер заказал 100-400, а база стоит 200-300.
Ребят, еще раз предлагаю: нарисуйте все 4 (четыре) возможных варианта на бумаге и попробуйте найти общие места. Решение очень простое - два условия с одним AND.
Я подобную задачу решал 6 лет назад на одном из первых своих сайтов...
Решение glock18'a охватывает 3 из 4-х возможных вариантов. Остается неохваченым вариант когда юзер заказал 100-400, а база стоит 200-300.
Ребят, еще раз предлагаю: нарисуйте все 4 (четыре) возможных варианта на бумаге и попробуйте найти общие места. Решение очень простое - два условия с одним AND.
Я подобную задачу решал 6 лет назад на одном из первых своих сайтов...
Спустя 15 минут, 38 секунд (28.05.2009 - 22:26) sergeiss написал(а):
Ежели 2 условия с одним ЭНД... Это получается, что
1. Верхняя граница запроса пользователя выше нижней границы предложения фирмы, И
2. Нижняя граница запроса пользователя ниже верхней границы предложения фирмы.
1. Верхняя граница запроса пользователя выше нижней границы предложения фирмы, И
2. Нижняя граница запроса пользователя ниже верхней границы предложения фирмы.