MySQL Problem mit Abfrage (LEFT JOIN...)

nikks

Grünschnabel
Ich habe ein Problem bei einer Abfrage, doch zunächst die Ausgangssituation:

Thema: Zimmerreservierung
2 Tabellen: "Zimmer" und "Reservierungen"


Zimmer enthält z.B. ZimmerID (PK, Fremdschlüssel in Reservierungen) Zimmerart, .... und Reservierungen enthält ReservierungsID, ZimmerID (s.o.), Buchungsbeginn, Buchungsende


Gegeben seien ein Anfangs- und Enddatum. Ich möchte nun alle Zimmer ausgeben, die in diesem Zeitraum NICHT reserviert sind, sprich frei sind.

Folgendes habe ich derzeit:


Code:
SELECT DISTINCT z.zimmerID, z.art FROM zimmer z

LEFT JOIN reservierungen r ON (z.zimmerID = r.zimmerID) WHERE ((r.reservID IS null)

OR (([Anreisedatum] >= reservEnd) OR ([Abreisedatum] <= reservAnf))) AND ("Doppelzimmer" = z.art)

"reservID IS null" -> damit die Zimmer ausgegeben werden, die niemals gebucht wurden, also zwingend frei sind.



Das ganze klappt nicht, es werden auch die Zimmer ausgegeben, die eigentlich schon reserviert sind.

Ich denke das hat mit dem JOIN zu tun, da in der virtuellen Tabelle 1 Zimmer nicht zwingend nur 1x vorkommt. ich müsste ihm also klarmachen, dass der Abgleich des An-/Abreisedatums niemals negativ ausfallen darf, auch nicht bei einem der mehreren Datensätze zum jeweiligen Zimmer.


Kann ich das Problem anders lösen? Evtl. mit einem Subselect? Bitte um Hilfe, da ich verzweifle :confused:
 
Hallo nikks,

ich kann erstmal nichts erkennen, was direkt falsch ist an deiner Query. Die Datumseinschränkung sollte funktionieren, die anderen Datensätze findest du durch reservid IS NULL.

Gibt es sonst noch etwas besonderes? Werden vielleicht nicht immer beide Zeitangaben (reservanf bzw. reservend) gefüllt und ist damit einer von beiden NULL ? Bei unvollständigen Reservierungen etc. Keine Ahnung, was du zulässt in der DB. Dann kann so ein Verhalten auftreten.

Kannst es ja mal prüfen
Markus
 
danke für die hilfe,

ich habe inzwischen eine lösung gefunden.

noch mal zur problematik, die ich nicht sehr gut beschreiben kann. das problem war, dass - bedingt durch den JOIN - zimmer mehrmals in der geJOINten tabelle vorkamen. nämlich wenn es mehrere reservierungen für die zimmer gegeben hatte. die datensätze unterschieden sich also ausschließlich in reservAnf und reservEnd.

sprich in einem der datensätze waren die WHERE klauseln erfüllt, was schon ausreichte um das zimmer als "frei" anzuzeigen. dies ist falsch, denn die klauseln mussten in ALLEN datensätzen des selben zimmers erfüllt sein.


jedenfalls habe ich es so gelöst:

temporäre tabelle erstellen mit dem o.g. statement, um erstmal alle zimmer die in frage kommen zu kriegen. aus der tabelle dann via DELETE die zimmer herausgenommen, die den datumsabgleich nicht bestehen (mit [DATE] BETWEEN Anf AND End.........)

diese fertige tabelle dann ausgeben und die sache hat sich :)
 
Zurück