Mailinglisten-Archive |
>Jetzt brauche ich den select für z. B. folgende Anfrage: >"Zeig mir alle Schulen mit Bushaltestelle im Raum Köln, UND deren Zimmer >(die über Streamer und Overheadproj. verfügen müssen und vom 01.08.03 bis >05.08.03 nicht belegt sind." >Logischerweise hat jede Schule viele Zimmer und jedes Zimmer viele >Belegungen. >Ich habe folgendes versucht (mit falschem Ergebnis :-(): >Sollte ich einen join verwenden? Ich bin ziemlich neu mit MySQL und die >Joins sind mir noch nicht so klar, aber diese Such dauert ziemlich lang und, >wie gesagt, das Ergebnis ist's leider auch nicht :-((. >Wäre super, wenn mir jemand helfen würde. Hi Hermann, So wie du das beschreibst ist in der Tabelle Belegungen nur verzeichnet von wann bis wann ein Raum belegt ist. Da kommst du mit deiner Select - Anweisung nicht weiter. Ist ein Raum nie belegt (also immer frei) ist dieser in der Tabelle belegungen ja gar nicht vorhanden. Die findest du mit deiner Abfrage nie... Suchen wir jetzt mal diese Räume: SELECT raeume. * FROM raeume LEFT JOIN belegungen ON raeume.rid = belegungen.rid WHERE belegungen.rid IS NULL AND raeume.rid IS NOT NULL Jetzt haben wir alle Räume die nie belegt wurden (oder werden ;-))... Das langt aber noch nicht. Schreiten wir fort. Jetzt holen wir alle Datensätze die in diesem Zeitraum belegt sind: SELECT raeume. * FROM raeume LEFT JOIN belegungen ON raeume.rid = belegungen.rid WHERE belegungen.start between '2003-08-01' and '2003-08-03' OR belegungen.stop between '2003-08-01' and '2003-08-03' Jetzt baun wir das so zusammen, dass wir alle Räume bekommen die zu diesem Zeitraum nicht belegt sind: SELECT raeume. * FROM raeume LEFT JOIN belegungen ON raeume.rid = belegungen.rid AND (belegungen.start between '2003-08-01' and '2003-08-03' OR belegungen.stop between '2003-08-01' and '2003-08-03') WHERE belegungen.rid IS NULL AND raeume.rid IS NOT NULL Laut Handbuch soll das zwar so net gehen, aber Papier ist geduldig ;-)... Einen Streamer un nen Overheadprojektor brauchen wir ja auch noch... SELECT raeume. * FROM raeume LEFT JOIN belegungen ON raeume.rid = belegungen.rid AND (belegungen.start between '2003-08-01' and '2003-08-03' OR belegungen.stop between '2003-08-01' and '2003-08-03') AND ( raeume.streamer = '0' OR and raeume.ohp = '0') WHERE belegungen.rid IS NULL AND raeume.rid IS NOT NULL Hier müssen wir logischerweise die Zimmer suchen, dein keinen Overheadprojektor oder Streamer haben ;-)) Die Schulen brauchen wir ja auch noch: SELECT schulen.sid, schulen.name, schulen.ort, raeume.nr FROM schulen LEFT JOIN raeume ON schulen.sid = raeume.sid LEFT JOIN belegungen ON raeume.rid = belegungen.rid AND (belegungen.start between '2003-08-01' and '2003-08-03' OR belegungen.stop between '2003-08-01' and '2003-08-03') AND ( raeume.streamer = '0' OR and raeume.ohp = '0') WHERE belegungen.rid IS NULL AND raeume.rid IS NOT NULL Noch die Haltestellen in Köln... SELECT schulen.sid, schulen.name, schulen.ort, raeume.nr FROM schulen LEFT JOIN raeume ON schulen.sid = raeume.sid AND schulen.region = 'koeln' AND schulen.verkehr = 'bh' LEFT JOIN belegungen ON raeume.rid = belegungen.rid AND (belegungen.start between '2003-08-01' and '2003-08-03' OR belegungen.stop between '2003-08-01' and '2003-08-03') AND ( raeume.streamer = '0' OR and raeume.ohp = '0') WHERE belegungen.rid IS NULL AND raeume.rid IS NOT NULL Schwitz... Jetzt müsste das funzen, ist aber nicht getestet, logisch ;-)) MfG Wolfgang -- Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter -->> http://www.4t2.com/mysql
php::bar PHP Wiki - Listenarchive