2017-01-28 2 views
1

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

SELECT DISTINCT r.id, 
      r.num, 
      r.NAME, 
      h.NAME, 
      h.city, 
      h.country 
FROM room r 
    JOIN hotel h 
    ON r.hotel_id = h.id 
    JOIN room_type rt 
    ON r.room_type_id = rt.id 
WHERE r.id NOT IN (SELECT room_id 
        FROM reservation 
        WHERE ('$from' BETWEEN start_date AND end_date) 
         OR (start_date BETWEEN '$from' AND '$to') 
         OR '$from' = start_date) 
    AND $roomtype = rt.id 
    AND $hotel = h.id 

Этот запрос будет использоваться в PHP скрипт, где «$ от» выбрана пользователя начало срока резервирования и $ в это конец резервирования и т.д.

Есть ли способ, чтобы сделать этот запрос работать, даже если в комнате нет оговорок? Любая помощь очень ценится!

ответ

0

Логика не-свободной комнате:

  • Бронирование начинается или до рассматриваемого периода заканчивается.
  • Резервирование заканчивается на или после указанного периода.

Недоступный номер. Давайте применим эту логику к вашему запросу:

SELECT r.id, r.num, r.name, h.name, h.city, h.country 
FROM room r JOIN 
    hotel h 
    ON r.hotel_id = h.id JOIN 
    room_type rt 
    ON r.room_type_id = rt.id 
WHERE rt.id = $roomtype AND 
     h.id = $hotel AND 
     r.id NOT IN (SELECT res.room_id 
        FROM reservation res 
        WHERE '$to' <= end_date AND 
         '$from' >= start_date AND 
       ); 

Примечание: Вы должны использовать параметры для значений в запросе, а не munging строки запроса.

+0

Большое спасибо за такой быстрый ответ. Я применил вашу логику, и теперь она работает правильно! Также имеет смысл проверить rt.id и r.id перед подзапросом. Благодаря :) – heap1

Смежные вопросы