Создание вложенного запроса

mastrelelik

Новичок
Просьба помочь создать запрос для следующей задачи.
В БД есть строки со следующими полями:
id | hotel_id | date_begin | date_end | price | currency
И, например, значениями

1 | 300 | 01.07.2016 | 09.07.2016 | 100 | usd
2 | 300 | 10.07.2016 | 19.07.2016 | 200 | usd
3 | 300 | 20.07.2016 | 29.07.2016 | 150 | usd

Пользователь вводит в поисковой форме разброс дат с 05.07.2016 по 21.07.2016
Количество дней: 7
и сумму за проживания от 1000 $ до 1500 $

В результате надо найти все отрезки дат подходящие под эти условия с подсчитанной суммой.
Например, первый найденный отрезок будет: с 06.07.2016 по 12.07.2016 и стоимостью проживания 1000 $
 

Vano

Новичок
А вообще советую сделать как я. Нарисуй на бумаге два временных промежутка в 6ти вариантах размещения их относительно друг друга. При чем, чтобы обозначить начало и конец отрезков используй не дату, а простые числа (так проще ориентироватся). К примеру отрезок А и отрезок B. A_start, A_end, B_start, B_end и найди 4 варианта их пересечения. И вперед.
 

mastrelelik

Новичок
Ану покажи как ты пробывал сам?
Я пока решил сделать вспомогательную таблицу, в которой буду хранить цельные отрезки например для данного примера будет один отрезок с 01.07.2016 по 29.07.2016
Потому что могут быть номера забронированы, и, следовательно, некоторые дни могут быть недоступны. Без этой вспомогательной таблицы один запрос становится просто гигантским.
Нарисуй на бумаге
Я так и делаю, для наглядности проще.
 

AnrDaemon

Продвинутый новичок
Запрос конечен для любого количества отелей, а про забронированность номеров в условии ничего не сказано.
 

Jake Badland

Новичок
SET
@original_date = STR_TO_DATE('2001-07-24', '%Y-%c-%d'),
@looking_price = 1000;
SELECT id
FROM hotels
WHERE price = @looking_price
AND date_begin < @original_date
AND @original_date < date_end

Подставишь свои значения) Если порядок год/месяц/день другой - подправь формат.
 

mastrelelik

Новичок
SET
@original_date = STR_TO_DATE('2001-07-24', '%Y-%c-%d'),
@looking_price = 1000;
SELECT id
FROM hotels
WHERE price = @looking_price
AND date_begin < @original_date
AND @original_date < date_end

Подставишь свои значения) Если порядок год/месяц/день другой - подправь формат.
Тут нужно уточнение значения 100, 200, 150 - это стоимость за один день. Поэтому сравнивать финальную стоимость с дневной таксой не получится.
 

Jake Badland

Новичок
Дык, вы хотите все это сразу в SQL запросе ? Почему бы на пыхе не подсчитать требуемое значение, взять допустим по 10% в обе стороны и подсунуть в запрос?
Вообще пользователь вводит сумму за месяц, а надо искать из тех которые посуточно ?
 

mastrelelik

Новичок
Дык, вы хотите все это сразу в SQL запросе ? Почему бы на пыхе не подсчитать требуемое значение, взять допустим по 10% в обе стороны и подсунуть в запрос?
Вообще пользователь вводит сумму за месяц, а надо искать из тех которые посуточно ?
Это нужно для перспективы, если найденных данных будет много, то ограничивать число выборки при помощи limit.
 

Jake Badland

Новичок
SET
@original_date = STR_TO_DATE('2001-07-24', '%Y-%c-%d'),
@looking_price = 1000,
@days = (SELECT EXTRACT(DAY FROM LAST_DAY(CURRENT_DATE))),
@per_day = ROUND(@looking_price/@days),
SELECT
id,
@per_day
FROM hotels
WHERE
(price - 50 < @per_day AND $per_day < price + 50)
AND date_begin < @original_date
AND @original_date < date_end
LIMIT 10

Это в случае если пользователь указывает сумму за месяц.
 
Сверху