Hallo,
Ich will eine zusätzliche Bedingung in meinen query einbauen. Der soll mir alle Objekte aus objects ausgeben, für die zu einem gegebenen Datum ($beg,$end) kein Eintrag in bookings vorhanden ist (keine Buchung vorliegt):
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.
$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))
)
";
> Habe noch den Tipp bekommen das Ganze mit JOIN zu machen, nur wie kombiniere ich JOIN mit meiner zusätzlichen Bedingung? Oder ist ein JOIN gar ncht nötig?
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.
Kommen wir nun zum Kern des Problems, das ich mit Deiner Frage habe:
$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.
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.
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().
Freundliche Grüße
Vinzenz