2017-01-28 6 views
1

Ich arbeite derzeit an einem Hotel Buchungsservice und ich möchte alle freien Zimmer für einen bestimmten Zimmertyp und Hotel für einen bestimmten Zeitraum zeigen. Ich habe eine scheinbar funktionierende Anfrage gefunden, bis mir aufgefallen ist: Wenn ein Zimmer überhaupt keine Reservierung hat, funktioniert es nicht.SQL für die Suche nach freien Zimmern in einem bestimmten Zeitraum

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 

Diese Abfrage wird in einem PHP-Skript verwendet werden, wobei „$“ von dem gewählten Beginn des Reservierungsdatums des Benutzers ist und das Ende der Reservierung $, ist usw.

Gibt es eine Möglichkeit, diese Abfrage zu machen Arbeit auch wenn ein Zimmer keine Reservierungen hat? Jede Hilfe wird sehr geschätzt!

Antwort

0

Die Logik für einen nicht freien Raum ist:

  • Die Buchung beginnt am oder vor dem betreffenden Zeitraum endet.
  • Die Buchung endet am oder nach dem betreffenden Zeitraum.

A nicht nicht freier Raum zur Verfügung steht. Lassen Sie uns diese Logik auf Ihre Anfrage gelten:

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 
       ); 

Hinweis: Sie sollten für Werte in der Abfrage unter Verwendung von Parametern, anstatt munging Query-Strings.

+0

Vielen Dank für eine schnelle Antwort. Ich habe deine Logik angewendet und jetzt funktioniert es endlich richtig! Es macht auch sehr viel Sinn, rt.id und r.id vor der Unterabfrage zu überprüfen. Vielen Dank :) – heap1

Verwandte Themen