2017-07-19 4 views
-1

Ich versuche, ein Online-Raumreservierungssystem für ein kleines Hotel zu erstellen. Eine der Tabellen der Datenbank soll die Buchungen halten. Es hat ein Auto-Nummer-Feld, Kundendatenfelder, zwei Datumsfelder für An- und Abreise und ein Nummernfeld für die Anzahl der gebuchten Zimmer. Eine Suchseite übermittelt das Ankunfts- und Abreisedatum an eine Ergebnisseite, die dem Kunden dann mitteilen soll, wie viele Zimmer innerhalb des Zeitraums verfügbar sind. Hier läuft alles schief. Ich kann nicht genau die Anzahl der Zimmer erhalten, die bereits innerhalb des gewünschten Zeitraums gebucht wurden.Mysql Abfrage für Hotelzimmer Verfügbarkeit

guest | arrive  | depart  |booked 
Smith | 2002-06-11 | 2002-06-18 | 1 
Jones | 2002-06-12 | 2002-06-14 | 2 
Brown | 2002-06-13 | 2002-06-16 | 1 
White | 2002-06-15 | 2002-06-17 | 2 

Wenn das Hotel 9 Zimmer hat, hier ist eine tägliche Liste der Anzahl der verfügbaren Zimmer. Ich möchte das Ergebnis so.

date  available  status 
2002-06-10 | 9  | Hotel is empty 
2002-06-11 | 8  | Smith checks in 
2002-06-12 | 6  | Jones checks in 
2002-06-13 | 5  | Brown checks in 
2002-06-14 | 7  | Jones checks out 
2002-06-15 | 5  | White checks in 
2002-06-16 | 6  | Brown checks out 
2002-06-17 | 8  | White checks out 
2002-06-18 | 9  | Smith checks out 

Bitte helfen Sie mir eine Lösung

+1

Bitte posten Sie die Abfrage, die Sie derzeit verwenden, die nicht 100% perfekte Ergebnisse und vielleicht können wir Ihnen helfen, es zu verbessern. – csmckelvey

+0

In dem Maße, in dem dies ein Anzeigeproblem ist, sollten Sie diese Aspekte des Problems im Anwendungscode behandeln. – Strawberry

+0

Auch, (warum) muss ein Gast alle Zimmer für die gleiche Anzahl von Tagen buchen. – Strawberry

Antwort

1

Ein Kalender-Tabelle nicht unbedingt notwendig für Probleme dieser Art ist, zu finden, aber sie können das Problem auf eine schnelle und einfache Art und Weise zu konzipieren helfen. So habe ich einen Kalender Tisch mit Daten von 1900 bis 4000 und etwas ...

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(booking_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,guest VARCHAR(12) NOT NULL 
,arrive DATE NOT NULL 
,depart DATE NOT NULL 
,booked INT NOT NULL 
,UNIQUE KEY(guest,arrive) 
); 

INSERT INTO my_table (guest,arrive,depart,booked) VALUES 
('Smith','2002-06-11','2002-06-18',1), 
('Jones','2002-06-12','2002-06-14',2), 
('Brown','2002-06-13','2002-06-16',1), 
('White','2002-06-15','2002-06-17',2); 

SELECT x.dt 
    , 9 - COALESCE(SUM(booked),0) available 
    FROM calendar x 
    LEFT 
    JOIN my_table y 
    ON x.dt >= y.arrive AND x.dt < y.depart 
WHERE x.dt BETWEEN '2002-06-10' AND '2002-06-20' 
GROUP 
    BY dt; 
+------------+-----------+ 
| dt   | available | 
+------------+-----------+ 
| 2002-06-10 |   9 | 
| 2002-06-11 |   8 | 
| 2002-06-12 |   6 | 
| 2002-06-13 |   5 | 
| 2002-06-14 |   7 | 
| 2002-06-15 |   5 | 
| 2002-06-16 |   6 | 
| 2002-06-17 |   8 | 
| 2002-06-18 |   9 | 
| 2002-06-19 |   9 | 
| 2002-06-20 |   9 | 
+------------+-----------+ 
11 rows in set (0.00 sec)