Hei,
minulla on tietokanta ja siellä taulu varaus. Taulussa varaus on kohdat tulo- ja lähtöpäiville joten nyt pitäisi osata hakea vapaat mökit noiden tietojen perusteella. Tähän on varmaan jokin todella yksinkertainen temppu, mutta en ole keksinyt sitä.
Eli jos käyttäjä 1 on varannut mökin ja laittanut tulopäiväksi 1.1.2010 ja lähtöpäiväksi 10.1.2010 ja sitten tulee toinen käyttäjä joka haluaisi varata saman mökin ja laittaa tulopäiväksi 5.1.2010 ja lähtöpäiväksi 15.1.2010 niin miten kaikkein yksinkertaisimmillaan saan sivun sanomaan että se on varattu eikä käyttäjä 2 pysty varaamaan noiksi päiviksi?
Mitä tarkoittaa, että varaukset ovat päällekkäin? Se tarkoittaa tietenkin sitä, että yhden varauksen alku tai loppu on toisen varauksen alun ja lopun välissä.
WHERE alku1 BETWEEN alku2 AND loppu2 OR loppu1 BETWEEN alku2 AND loppu2 OR alku2 BETWEEN alku1 AND loppu1 OR loppu2 BETWEEN alku1 AND loppu1
Jos haluat tarkistaa yhden mökin (esim. kun varausnappia on painettu), katso, onko varaustaulussa samalle mökille jokin varaus, joka täyttää yllä esitetyn ehdon.
SELECT 1 FROM varaus WHERE mokki_id = 123 AND ("2010-01-05" BETWEEN alku AND loppu OR "2010-01-15" BETWEEN alku AND loppu OR alku BETWEEN "2010-01-05" AND "2010-01-15" OR loppu BETWEEN "2010-01-05" AND "2010-01-15")
Jos haluat hakea tietyllä aikavälillä vapaat mökit, voit soveltaa samaa kyselyä alikyselynä:
SELECT * FROM mokki WHERE NOT EXISTS ( -- edellinen kysely tähän, mutta WHERE mokki_id = mokki.id )
Sama onnistuisi myös LEFT JOIN -kyselyllä, jossa valitaan kaikki mökit, liitetään mukaan jokaiseen liittyvät varaukset tutkittavalta väliltä ja otetaan WHERE-osassa mukaan vain ne rivit, joille varausta ei vielä löytynyt.
SELECT mokki.* FROM mokki LEFT JOIN varaus ON varaus.mokki_id = mokki.id -- AND aikatarkistukset... WHERE varaus.mokki_id IS NULL
Varmaan käytettävyyden kannalta kuitenkin kannattaisi näyttää varatut päivät myös ennen varausprosessia, jolloin asiakkaiden ei tarvitse arvailla kaikkia mahdollisia kombinaatioita.
Unohtakaa edellinen viestini. (Mod. poisti.) Vahinko että omia vanhoja viestejään ei voi poistaa sillä tajusin kai mitä metabolix ajoi takaa. En tosin saanut sitäkään toimimaan oikein.
SELECT * FROM mokit WHERE NOT EXISTS(SELECT 1 FROM varaus WHERE '$tulopv' BETWEEN alkamispaiva AND loppumispaiva OR '$poistumispv' BETWEEN alkamispaiva AND loppumispaiva OR alkamispaiva BETWEEN '$tulopv' AND '$poistumispv' OR loppumispaiva BETWEEN '$tulopv' AND '$poistumispv')
Jostain syystä nimenomaan niinä päivinä ei kai näytä mitään mökkejä kun niiden pitäisi olla vapaana? Wtf?
EDIT: Ei se taidakkaan näyttää vain väärinä päivinä vaan se taitaakin näyttää ne aina vaikka ne olisi varattujakin.
Alikyselystäsi puuttuu mökin id, joka kyllä esimerkeissäni oli. Nythän tuo tarkistaa aina, onko kyseisellä ajalla mitään varausta, kun pitäisi tarkistaa joka mökille, onko juuri sitä kyseistä mökkiä varattu.
Lisäksi: onko päivämääräsi oikeassa muodossa (esim. 2010-12-31) ja ovatko varaustaulun sarakkeet DATE-tyyppisiä?
Metabolix kirjoitti:
Alikyselystäsi puuttuu mökin id, joka kyllä esimerkeissäni oli. Nythän tuo tarkistaa aina, onko kyseisellä ajalla mitään varausta, kun pitäisi tarkistaa joka mökille, onko juuri sitä kyseistä mökkiä varattu.
Lisäksi: onko päivämääräsi oikeassa muodossa (esim. 2010-12-31) ja ovatko varaustaulun sarakkeet DATE-tyyppisiä?
Kiitos nyt toimii. Se oli tosiaan se puuttuva mokki_id = mokit.id ja sen lisäämisen jälkeen alkoi pelittämään. Päivämäärät eivät ole oikeassa DATE-tyypin muodossa ja huomasin sen jälkikäteen kun yritin tallentaa tietokantaan tietoa joten tein pikaisen korjausvirityksen ja aina tarvittaessa muunnan ne oikeaan muotoon. Aika purkkaa... toivottavasti kelpaa opettajalle. :D
Lebe80 kirjoitti:
Varmaan käytettävyyden kannalta kuitenkin kannattaisi näyttää varatut päivät myös ennen varausprosessia, jolloin asiakkaiden ei tarvitse arvailla kaikkia mahdollisia kombinaatioita.
Siksi se ei näytäkkään kuin vain vapaana olevat mökit ettei asiakkaiden tarvitse arpoa varausjärjestelmässä sitä että onko mökki vapaa vai varattu. Varsinainen koulutehtävä käsitti vielä vasta sen itse varausjärjestelmän, mutta kunhan seuraavalla kurssilla edetään sitten vielä pidemmälle niin tulee sitten tarpeelliseksi rakentaa varmaan jo jokin kalenteri josta näkyy minä päivinä mökki on varattu ja minä päivinä ei.
Aihe on jo aika vanha, joten et voi enää vastata siihen.