Я создал простой запрос, чтобы узнать, какая вилла будет свободна в течение определенного диапазона дней (checkin_date и checkout_date).

Однако теперь, когда я думаю об этом, я не думаю, что мой запрос ниже вернет правильные результаты:

SELECT DISTINCT default_villa_type  
FROM villa, reservation  
WHERE villa.villa_type = reservation.default_villa_type  
and res_checkin_date not between '2011-12-21' and '2011-12-23'
and res_checkout_date not between '2011-12-21' and '2011-12-23'

Мне нужен запрос для использования:

Таблица вилл со следующими столбцами:

(villa_id, phone_ext, villa_type, no_of_rooms, no_of_beds, default_price_plan)

Таблица резервирования со следующими столбцами:

(confirm_no, credit_card_no, res_checkin_date, res_checkout_date, default_villa_type, price_plan)

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

0
Jon 10 Апр 2011 в 12:39
Случаем, который нарушит ваш код, будет случай, когда регистрация бронирования произошла до даты начала указанного диапазона, а дата выезда — после даты окончания диапазона. Таким образом, если бронирование виллы было с 20 декабря 2011 г. по 24 декабря 2011 г., эта вилла не свободна, но ваш код вернет ее как бесплатную.
 – 
bitxwise
10 Апр 2011 в 12:51
Разве не должно быть поле villa_id в таблице reservation? Откуда вы знаете, какая вилла была забронирована?
 – 
ypercubeᵀᴹ
10 Апр 2011 в 13:50
Это все еще открыто или на ваш вопрос ответили?
 – 
bitxwise
18 Апр 2011 в 17:28

1 ответ

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

SELECT  villa_id
FROM    villa
WHERE   villa_type NOT IN (
    SELECT  default_villa_type
    FROM    reservation
            --reservations starting within range
    WHERE   res_checkin_date > '2011-12-21'
            AND res_checkin_date < '2011-12-23'

            --reservations starting before range and ending after range
            OR (
                res_checkin_date <= '2011-12-21'
                AND res_checkout_date > '2011-12-21'
            )

            --reservations ending within range
            OR (
                res_checkout_date > '2011-12-21'
                AND res_checkout_date < '2011-12-23'
            )
)

Другой способ, согласно комментарию Микаэля, может быть:

SELECT  villa_id
FROM    villa
WHERE   villa_type NOT IN (
    SELECT default_villa_type
    FROM   reservation
    WHERE  res_checkin_date < '2011-12-23'
           AND res_checkout_date > '2011-12-21'
)

Я также предлагаю вам использовать переменные вместо статических строковых дат.

2
bitxwise 10 Апр 2011 в 21:05
Вы можете немного упростить предложение where. Взгляните на этот ответ. stackoverflow.com/questions/5002689/…
 – 
Mikael Eriksson
10 Апр 2011 в 15:31
Спасибо, Микаэль. Написал это довольно поздно ночью и просто "грубым форсированием".
 – 
bitxwise
10 Апр 2011 в 21:05