phpbar.de logo

Mailinglisten-Archive

Suche nach freienZeiträumen

Suche nach freienZeiträumen

Cybot 4t2.com-mysql at tekkno4u.de
Mon Apr 28 15:37:34 CEST 2003



Hermann Kuffner wrote:

> Hallo Liste,
> 
> ich komm mit einem select einfach nicht weiter (trotz Handbuch wälzen!):
> ich habe 3 tabellen: 'schulen', 'raeume', 'belegungen'
> verknüpft sind die 3 folgendermassen:
> schulen.sid => raeume.sid
> raeume.rid => belegung.rid
> 
> 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 :-():
> 
> select schulen.sid, schulen.name, schulen.ort, raeume.nr
> from schulen, raeume, belegungen
> where belegungen.start not between '2003-08-01' and '2003-08-03'
> and belegungen.stop not between '2003-08-01' and '2003-08-03'
> and raeume.rid = belegungen.rid
> and raeume.streamer = '1'
> and raeume.ohp = '1'
> and schulen.sid = raeume.sid
> and schulen.region = 'koeln'
> and schulen.verkehr = 'bh'
> group by schulen.sid
> order by schulen.ort asc, schulen.name asc, raeume.nr asc

du solltest die tabelle an erste stelle stellen welche von vornherien 
die wenigsten treffer bringt, da so mysql gleich am anfang viel 
ausschließen kann, was die geschwindigkeit erhöht

außerdem verträgt sich dein 'GROUP BY schulen.sid' nicht mit deinem 
'select schulen.sid, schulen.name, schulen.ort, raeume.nr' wegen dem 
'raeume.nr'

entweder

SELECT schulen.sid, schulen.name, schulen.ort
...
GROUP BY schulen.sid

oder

SELECT schulen.sid, schulen.name, schulen.ort, raeume.nr
..
ohne group by

aber du willst ja die schulen, nicht die räume, hast du geschrieben, also:

SELECT schulen.sid, schulen.name, schulen.ort
FROM raeume
LEFT JOIN belegungen ON raeume.rid = belegungen.rid
LEFT JOIN schulen ON raume.sid = schulen.sid
WHERE belegungen.start NOT BETWEEN '2003-08-01' AND '2003-08-03'
AND belegungen.stop NOT BETWEEN '2003-08-01' AND '2003-08-03'
AND raeume.streamer = '1'
AND raeume.ohp = '1'
AND schulen.region = 'koeln'
AND schulen.verkehr = 'bh'
GROUP BY schulen.sid
ORDER BY schulen.ort ASC, schulen.name ASC

> 
> 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.
> 
> Danke
> Hermann
> 

-- 
Sebastian Mendel

www.sebastianmendel.de
www.tekkno4u.de
www.nofetish.com

-- 
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->>  http://www.4t2.com/mysql 


php::bar PHP Wiki   -   Listenarchive