Herzlichen Dank für deine Antwort! Zu deinen Fragen:
es ist *nie* eine gute Idee, PHP-Code zu posten, wenn man ein SQL-Problem hat.
Es ist dagegen eine hervorragende Idee, mit dem Client der Wahl zunächst eine statische Abfrage zu erstellen, die das gewünschte Ergebnis liefert - und *erst dann* die Abfrage dynamisch mit $programmiersprache zusammenzubauen.
Habe ich quasi getan, die Variablen, die in meinem Query vorkommen habe ich zum "Basteln" fest definiert und den Query isoliert.
Wie üblich ein LEFT JOIN mit Prüfung auf NULL-Werte. Allerdings fällt dieser bei Deinem Problem komplizierter als die Subquery, da Deine Einschränkungen alle in die Join-Bedingung müssen.
Das ist mein Problem, ja ;)
$beg soll einen Startwert darstellen, $end einen Endwert. Was diese genau bedeuten, erschließt sich mir nicht. Unter den Spalten date1 und date2 kann ich mir gar nichts vorstellen, genauswenig wieso Deine drei über OR verknüpften Bedingungen Dir das gewünschte liefern. Bitte poste daher Beispieldaten:
Beispieldaten für die Werte, die in $beg und $end enthalten sein können,
Beispieldaten für objects, dazu passende für bookings - und erläutere, was das aufgrund dieser Beispieldaten gewünschte Ergebnis der Abfrage ist.
Es geht um Buchungen. $beg ist das Anfangsdatum (erster Tag der Vermietung) und $end das Enddatum.
zb.:
(('$end' > date1) AND ('$end' <= date2))
Enddatum der Eingabe zwischen Anfangs (date1)- und Enddatum (date2) einer bereits bestehenden Buchung? -> Kollision
Rest analog
Ein mögliches object: Nr, Name, beschreibung
eine mögliche Buchung: Name des Kunden, gebuchtes Objekt, Anfangsdatum, Enddatum
Um nun für eine neue Buchung die Verfügbarkeiten zu prüfen, will ich alle objects haben, die für den neu angefragten Zeitraum noch frei sind.
Bsp: Anfrage für Buchung vom 10.12.08 - 12.12.08. Ausgabe soll sein: Alle objects, für die in diesem Zeitraum noch keine Buchung in bookings eingetragen ist.
$beg="20081210"; $end="20081212";
$query = "SELECT nr FROM objects WHERE nr NOT IN
(
SELECT objnr FROM bookings WHERE
(('$end' > date1) AND ('$end' <= date2))
OR
(('$beg' < date2) AND ('$beg' >= date1))
OR
(('$beg' <= date1) AND ('$end' >= date2))
)
";
>
>
> Eine Idee hätte ich noch zu PHP:
> Lass Dir das generierte Statement anzeigen. Es könnte sein, dass $beg und/oder $end nicht das enthalten, was Du vermutest. Poste das erzeugte Statement.
S.o., schon abgeklärt. Das Statement:
SELECT nr FROM objects WHERE nr NOT IN ( SELECT objnr FROM bookings WHERE (('20081212' > date1) AND ('20081212' <= date2)) OR (('20081210' < date2) AND ('20081210' >= date1)) OR (('20081210' <= date1) AND ('20081212' >= date2)) )
> Ach ja, es ist eine sehr gute Idee, Daten, die von außerhalb kommen in einem SQL-Statement gemäß DBMS zu behandeln, z.B. mit mysql(i)\_real\_escape\_string().
Variablen sind sauber, die Prüfung erfolgt vorneweg, bei der Eingabe, weil ich die Info da schon brauche.
Grüße,
Max