Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SQL] Wyświetlanie wolnych pokoi wg. terminarza
-coCCine-
post
Post #1





Goście







Cześć wszystkim!

Zastanawiam się w jaki sposób OPTYMALNIE zrealizować następujące założenie. Mamy tabelę gdzie trzymam spis pokoi, oraz tabele, w której trzymam informacje
nt. rezerwacji dla danego pokoju. Użytkownik przez formularz wysyła dwie daty (startową i końcową - od kiedy; do kiedy chce wynająć pokój) i teraz chciałbym pobrać listę pokoi (nazwa pokoju, opis pokoju, itd), gdzie rezerwacja będzie wolna - myślałem nad takim rozwiązaniem;

  1. # {CZAS_START} - unixtimestamp (np. 2013-10-01)
  2. # {KONIEC_CZASU} - unixtimestamp (np. 2013-10-08)
  3.  
  4. SELECT p.id AS pokoj_id, p.name, p.description FROM pokoje AS p
  5. WHERE p.id NOT IN(SELECT rez.hotel_pokoj_id FROM rezerwacje AS rez WHERE raz.start_rezerwacji >= {CZAS_START} AND raz.koniec_rezerwacji <= {KONIEC_CZASU})
  6. AND p.country_id = 'pl'


Struktura tabel wygląda mniej więcej tak:
  1. # pokoje
  2. id, name, description, country_id
  3.  
  4. # rezerwacje
  5. id, hotel_pokoj_id, start_rezerwacji, koniec_rezerwacji, dane_kontaktowe


Chciałbym Was prosić, czy dobrze jest zbudowana LOGIKA tego podzapytania - czy warunek WHERE ma sens ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Sephirus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Nie wchodząc w sprawy techniczne a algorytmiczne:

Jeśli mamy dwa zakresy dat, które nie mogą się w żaden sposób krzyżować to musisz sprawdzić sporo możliwych kombinacji.

Jeśli data startu planowanej rezerwacji zawiera się w okresie zajętości pokoju
lub
jeśli data końca planowanej rezerwacji zawiera się w okresie zajętości pokoju
lub
jeśli data startu zajętości pokoju zawiera się w okresie planowanej rezerwacji
lub
jeśli data końca zajętości pokoju zawiera się w okresie planowanej rezerwacji

to ten pokój powinien zostać wyeliminowany. Wystarczy to zanegować i użyć w zapytaniu by otrzymać listę pokoju które mogą być zarezerwowane (IMG:style_emoticons/default/smile.gif)

  1.  
  2. NOT (
  3. rez.start_rezerwacji BETWEEN {CZAS_START} AND {KONIEC_CZASU}
  4. OR
  5. rez.koniec_rezerwacji BETWEEN {CZAS_START} AND {KONIEC_CZASU}
  6. OR
  7. {CZAS_START} BETWEENrez.start_rezerwacji AND rez.koniec_rezerwacji
  8. OR
  9. {KONIEC_CZASU} BETWEENrez.start_rezerwacji AND rez.koniec_rezerwacji
  10. )
  11.  


Ten post edytował Sephirus 2.10.2013, 09:42:48
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 4.10.2025 - 14:40