Re: Freie Zimmer gesucht (aus datenbank)



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!

Jetzt noch die gar nicht triviale Erweiterung, konstant freie Zimmer
über einen ZEITRAUM zu finden...

Wenn der abzufragende Zeitraum durch @v und @b (entsprechend von-bis)
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
.



Relevant Pages

  • Re: Funktion if update(Spalte) im Trigger???
    ... FROM deleted d INNER JOIN inserted i ON ... WHERE d.TabId IN (SELECT d.TabId ... dann soll in einer Historientabelle der alte Status mit Datum und Benutzer ...
    (microsoft.public.de.sqlserver)
  • Re: 3 SQL Abfragen in 1
    ... Die einzelnen Felder müssen nun mit dem Inhalt der SQL Abfrage gefüllt ... SELECT FPWRNr, maxas Erlaubt, maxas Verboten FROM ... (SELECT FPWRNr,'' As Erlaubt, FPWRLand as Verboten FROM tbFWPReise WHERE ...
    (microsoft.public.de.sqlserver)
  • Re: Abfrage - Problem (SQL)
    ... SELECT DISTINCT qufrmW_ZAN.lgID AS ID, ... FROM qufrmW_ZAN ... WHERE qufrmW_ZAN.lgID=298 ... And ...
    (microsoft.public.de.access)
  • Re: Problem mit einer SQL Abfrage
    ... FROM (SELECT * FROM A WHERE active is null) c ... LEFT JOIN (SELECT * FROM B where restituion is null) d ...
    (de.comp.datenbanken.mysql)
  • Re: =?ISO-8859-15?Q?G=FCltig_von/bis?=
    ... SELECT `TeamA-ID`, `TeamB-ID` ... FROM spiele ... WHERE GueltigVon < DATE_SUB, INTERVAL 1 DAY) ... WHERE Datum < NOW ...
    (de.comp.datenbanken.mysql)

Loading