baskat: LEFT JOIN richtige Methode?

Hallo!

ich habe mir etliche Tutorials und Threads zum Thema LEFT JOIN durchgelesen, aber keiner der skizzierten Anwendungsfälle scheint so richtig zu meiner Problemstellung zu passen und ich bin mir mittlerweile nicht mehr sicher, ob es überhaupt der richtige Ansatz ist.

Es geht um eine Sportanlage mit mehreren Plätzen und die Möglichkeit einer Buchung mit wöchentlich wiederkehrenden Terminen - also z.B. jemand möchte Platz 2 für vier Wochen jeden Dienstag ab 16 Uhr für 2 Stunden nutzen.

Mein Ansatz war daher der, in einer Tabelle (booking_resource) die Plätze zu erfassen und in einer zweiten Tabelle (booking_schedule) die existierenden Buchungen abzuspeichern.

Um bei einer neuen Buchung Platzkonflikte zu vermeiden, wollte ich nur jene Plätze ausgeben, die für die gewählte Tag/Uhrzeit-Kombi noch frei sind.

Die Abfrage - so dachte ich anfangs zumindest - müsste mit einem LEFT JOIN leicht zu lösen sein:

SELECT res.id, res.title
FROM {booking_resource} res
LEFT JOIN {booking_schedule} sched
ON res.id = sched.rid
WHERE sched.timestamp != [unix-timestamp des gewünschten datums];

Im konkreten Script ist die WHERE-Bedingung komplexer, weil es ja immer um mehrere Termine geht, die der Besucher für die nächsten Wochen buchen will, aber vom Prinzip her dürfte das keinen Unterschied machen.

Mein Problem ist nun: Ich bin davon ausgegangen, dass der LEFT JOIN dafür sorgt, mir alle Resourcen (Plätze) zurückliefern würde, für die kein Eintrag in der schedule-Tabelle existiert. Dies geschieht jedoch nicht - ich bekomme gar kein Ergebnis zurück.

Was ist an meinem Ansatz falsch bzw. wie könnte man Eurer Ansicht nach den gewünschten Mechanismus besser in einem Query abbilden?

Vielen Dank im Voraus für Eure Anregungen!

Einen schönen Samstag wünscht
baskat

  1. Hello,

    Mein Problem ist nun: Ich bin davon ausgegangen, dass der LEFT JOIN dafür sorgt, mir alle Resourcen (Plätze) zurückliefern würde, für die kein Eintrag in der schedule-Tabelle existiert.

    das ist eine Fehlinterpretation. Ein Left Join liefert ALLE Datensätze zurück, die in der "linken" Tabelle existieren, und zwar im Gegensatz zum Inner Join unabhängig davon, ob er in der rechten Tabelle ein passendes Gegenstück findet oder nicht.

    Was ist an meinem Ansatz falsch bzw. wie könnte man Eurer Ansicht nach den gewünschten Mechanismus besser in einem Query abbilden?

    Vom Grundansatz könnte das schon so funktionieren, wobei du die von dir angenomme Vorbedingung über den LEFT JOIN erst noch herstellen musst, in dem du per WHERE-Klausel nur solche Datensätze zulässt, die in der resource-Tabelle NULL stehen haben, das sind nämlich die, die dort eben keine Entsprechung gefunden haben.

    Alternativ könntest du wahrscheinlich auch eine Subselect-Variante wählen, ich schreibe sie mal etwas sinngemäß auf:
    SELECT platz_id
    FROM buchungen
    WHERE <deine Datumskriterien>

    Das hier sind dann alle Plätze, die zum gesuchten Zeitpunkt eine Buchung aufweisen.
    Nun selektierst du alle Plätze, die NICHT diesen Kriterien entsprechen:
    SELECT ...
    FROM plaetze
    WHERE platz_id NOT IN (<select von oben>)
    und erhälst somit alle Plätze, für die es im Zeitraum keine derartige Buchung gibt.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    When the only tool you've got is a hammer, all problems start to look like nails.
    1. Alternativ könntest du wahrscheinlich auch eine Subselect-Variante wählen,

      Ja! Klasse - diese Methode gefällt mir! Sie ist logisch gut nachvollziehbar und macht genau das, was ich beabsichtigt habe.

      Ich dank' Dir sehr - damit komme ich ein gutes Stück voran!

      LG//baskat