Re: Freie Zimmer gesucht (aus datenbank)
- From: Axel Schwenke <axel.schwenke@xxxxxx>
- Date: Wed, 19 Aug 2009 12:31:01 +0200
In article <1j4imjm.16c0g1y1yfipd1N%kscheller@xxxxxxxxxxxxxxx>,
kscheller@xxxxxxxxxxxxxxx (Konni Scheller) writes:
Mittlerweile ist unsere Hausbrauerei pleite gegangen, und wir wollten
nicht mal mehr eine mittlere Brauerei. Deswegen gibt es jetzt 22
fränkische Biere bei uns (alkoholfreie zählen nicht).
Es gibt alkoholfreie fränkische Biere? Glaub ich nicht. Ich würde
denken: "alkoholfrei", "fränkisch", "Bier" - pick any two!
Wenn der abzufragende Zeitraum durch @v und @b (entsprechend von-bis)Jetzt noch die gar nicht triviale Erweiterung, konstant freie Zimmer
über einen ZEITRAUM zu finden...
ist und die Anzahl der unterzubringenden Personen @p, dann komme ich auf
folgende Abfrage, die zu funktionieren scheint, basierend auf Heikos
Ansatz:
SELECT r.id, r.capacity
FROM room r WHERE not exists
(SELECT id FROM bookings b WHERE
roomno=r.id AND
(arrival <= @b AND @v<depart
OR
(@v<=arrival AND arrival<@b)
)
)
AND r.capacity >= @p
;
Warum eine korrelierte Subquery?
Das würde ich eher mit einer NOT IN Subquery lösen:
SELECT r.id, r.capacity
FROM room r
WHERE r.capacity >= @p
AND r.id NOT IN
( SELECT roomno FROM bookings b
WHERE @b > b.arrival AND @v < b.depart
)
und das kann man dann auch als OUTER JOIN schreiben:
SELECT r.id, r.capacity
FROM room r
LEFT JOIN bookings b
ON (r.id = b.roomno AND @b > b.arrival AND @v < b.depart)
WHERE b.roomno IS NULL
AND r.capacity >= @p
NB: An der zeitlichen Bedingung habe ich etwas geknobelt. So bin
ich drauf gekommen: [@v, @b] und [arrival, depart] sind zeitliche
Intervalle, die sich nicht überlappen dürfen. Es gilt auch immer
@v<@b und arrival<depart.
Der gute Fall ist: (@b <= arrival OR $v >= depart)
Für das innere WHERE brauchen wir die Negation. Nach De Morgan
ist das dann: (@b > arrival AND $v < depart)
Jetzt kommen noch die Verfeinerungen, das programm soll auch zwei
Einzelzimmer vorschlagen, wenn Doppelzimmer angefragt wird und keines
mehr frei ist usw. :-)
Wenn du erst mal die Liste der Zimmer hast, ist das einfach.
Ein leicht modifizierter Greedy-Algorithmus und gut ist.
Für eine kleine zweistellige Zahl an Zimmern kann das auch
ein Rezeptionist. Besonders, wenn man oben noch ein ORDER BY
r.capacity DESC anhängt.
PS: und jetzt überleg dir gut, was du schreibst. Ein Kumpel von
mir wohnt in Fürth und dann liegt Forchheim fast auf dem Weg :)
XL
.
- Follow-Ups:
- Re: Freie Zimmer gesucht (aus datenbank)
- From: Christian Kirsch
- Re: Freie Zimmer gesucht (aus datenbank)
- From: Konni Scheller
- Re: Freie Zimmer gesucht (aus datenbank)
- References:
- Freie Zimmer gesucht (aus datenbank)
- From: Konni Scheller
- Re: Freie Zimmer gesucht (aus datenbank)
- From: Dieter Noeth
- Re: Freie Zimmer gesucht (aus datenbank)
- From: Konni Scheller
- Re: Freie Zimmer gesucht (aus datenbank)
- From: Dieter Noeth
- Re: Freie Zimmer gesucht (aus datenbank)
- From: Konni Scheller
- Freie Zimmer gesucht (aus datenbank)
- Prev by Date: Re: Freie Zimmer gesucht (aus datenbank)
- Next by Date: Re: Freie Zimmer gesucht (aus datenbank)
- Previous by thread: Re: Freie Zimmer gesucht (aus datenbank)
- Next by thread: Re: Freie Zimmer gesucht (aus datenbank)
- Index(es):
Relevant Pages
|
Loading