Als opdracht voor school moet ik dus een site maken voor een hotel waar mensen op kunnen reserveren. Ik zit nu alleen met een mysql probleempje.
De bedoeling is dat mensen een 2 datums kunnen selecteren, en door middel van die datums moet dus worden gechecked welke kamers vrij zijn, en deze zou die moeten weergeven momenteel heb ik dit:
SELECT r.id, r.room, b.roomno, b.datefrom, b.dateto
FROM rooms r, bookings b
WHERE r.id = b.roomno
AND '2011-04-19' NOT between b.datefrom AND b.dateto
AND '2011-04-20' NOT between b.datefrom AND b.dateto
Heb je toevallig ook een kleine dump waar je bijhoudt welke rooms bezet zijn?
-- Edit, als de afbeelding een voorbeeld is van je huidige query dan lijkt het me niet goed.. Je checked namelijk op welke personen er niet zijn tussen x en x, Als jantje op de 14e in kamer 8 zit, Pietje de 15e in kamer 8 en je de 16e checked, zal je waarschijnlijk al 2x kamer 8 terugkrijgen.
-- Edit2,
Als je in de rooms-tabel 2 velden erbij zet date_from en date_till, en in de gasten tabel het kamernummer opschrijft, kan je al snel zien welke bezet zijn. Ook kan je gemakkelijk zien welke gasten waar zijn. In de gastentabel krijg je een nummer terug (bijv kamer 8), aan de hand daarvan kan je kijken of die tussen bepaalde data liggen (maar dat is dus enkel als je wil weten welke kamer een gast NU heeft).
Heb je toevallig ook een kleine dump waar je bijhoudt welke rooms bezet zijn?
-- Edit, als de afbeelding een voorbeeld is van je huidige query dan lijkt het me niet goed.. Je checked namelijk op welke personen er niet zijn tussen x en x, Als jantje op de 14e in kamer 8 zit, Pietje de 15e in kamer 8 en je de 16e checked, zal je waarschijnlijk al 2x kamer 8 terugkrijgen.
-- Edit2,
Als je in de rooms-tabel 2 velden erbij zet date_from en date_till, en in de gasten tabel het kamernummer opschrijft, kan je al snel zien welke bezet zijn. Ook kan je gemakkelijk zien welke gasten waar zijn. In de gastentabel krijg je een nummer terug (bijv kamer 8), aan de hand daarvan kan je kijken of die tussen bepaalde data liggen (maar dat is dus enkel als je wil weten welke kamer een gast NU heeft).
de plaatjes zijn databases "bookings" en "rooms" die met kamer 1 2 3 4 5 6 heet dus rooms de ander is dus bookings
-- gereserveerde kamers, niet vrij
SELECT room_id FROM reservatietabel
WHERE reservatietabel.stopdatum > startdatum
AND reservatietabel.startdatum < stopdatum
-- gereserveerde kamers, niet vrij
SELECT room_id FROM reservatietabel
WHERE reservatietabel.stopdatum > startdatum
AND reservatietabel.startdatum < stopdatum
zo heb je alle gereserveerde kamers. ff illustreren.
startdatum stopdatum
|--------------------| -> gevraagde periode
|--------------------------------------------| -> overlappende reservatie
|----------| -> half over linkergrens
|------------| -> half over rechtergrens
|------------| -> niet volledige bezetting in het interval
|-----| -> reservatie buiten het interval
|------------| -> niet volledige bezetting in het interval
|-----| -> reservatie buiten het interval
De reservatie buiten het interval wordt dus niet geselecteerd want reservatie.start > stop
Indien je start en stop datum wil doen overlappen op de dag zelf (bijvoorbeeld als mensen moeten uitchecken voor 12 uur en pas hun kamer kunnen betrekken vanaf 16u) kan je nog spelen met >, <, <=, >=
Daarna selecteer je gwn alle kamers waarvan id NIET tot die set behoort
SELECT * FROM kamers
WHERE id NOT IN
(
SELECT room_id FROM reservatietabel
WHERE reservatietabel.stopdatum > startdatum
AND reservatietabel.startdatum < stopdatum
)
SELECT*FROM kamers
WHERE id NOTIN
(
SELECT room_id FROM reservatietabel
WHERE reservatietabel.stopdatum > startdatum
AND reservatietabel.startdatum < stopdatum
)
Je kan ook de eerste query inverteren (en dus de kamerid's ophalen die vrij zijn) en die dan JOINen aan de kamers. Da's wellicht een beter idee in termen van performance.
heb er dit nu van gemaakt:
SELECT * FROM rooms
WHERE id NOT IN
(
SELECT roomno FROM bookings
WHERE bookings.dateto > datefrom
AND bookings.datefrom < dateto
)
Daar was ik naar op zoek.
Het werk, super bedankt!!
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.