phpbar.de logo

Mailinglisten-Archive

Suche nach freienZeiträumen

Suche nach freienZeiträumen

Wolfgang Hauck wbh at euta.net
Mon Apr 28 18:43:11 CEST 2003


>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