Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zapytanie
Forum PHP.pl > Forum > Bazy danych > MySQL
slimy
resFrom i resTo w bazie danych zawierają datę rezerwacji (od, do)
analogicznie zmienne $this->resFrom i $this->resTo zawierają również datę rezerwacji dla danego obiektu

Poblem: Zapytanie ma sprawdzić czy istnieją już jakieś rezerwacje w tym terminie - po prostu czy termin jest wolny i nie koliduje z innymi rezerwacjami. Jeżeli znajdzie jakąś rezerwację to zwróci dla niej resID i resztę zrobi już skrypt. Czy poniższe zapytanie bierze pod uwagę wszystkie możliwości? Czy przy jakichś warunkach brzegowych będzie działało nie prawidłowo?

  1. SELECT resID FROM Reservations
  2. WHERE (resFrom < '{$this->resFrom}' AND resTo > '{$this->resFrom}')
  3. OR (resFrom >= '{$this->resFrom}' AND resFrom <= '{$this->resTo}');
nospor
Moze troche nie na temat, ale nie mogę zrozumiec Twojego zapytania. Mozesz mi slownie opisac kazdy z warunkow co robi oraz co robi kazda z grupy warunków (grupa - warunki w nawiasie). Albo może nie tyle co robi, ale co ty chcesz by robila.
slimy
W bazie mam taką tabelę:

  1. CREATE TABLE Reservations
  2. (
  3. resID integer AUTO_INCREMENT PRIMARY KEY,
  4. resFrom timestamp,
  5. resTo timestamp
  6. )


I są w niej różne wpisy dotyczące rezerwacji: od jakiejś daty do jakiejś daty (godziny nie istotne).

W kodzie tworzony jest obiekt klasy 'Reservation', który ma zmienne resFrom i resTo odpowiadające nowej rezerwacji. Gdy na tym obiekcie dokonuje się metody save(), która odpowiada za zapis obiektu do bazy danych to muszę najpierw sprawdzić czy daty rezerwacji z bieżącego obiektu nie nakładają się na już zarezerwowane terminy. By to sprawdzić chcę pobrać z bazy resID tych rezerwacji, które termin podanym w obiekcie zarezerwowały wcześniej. (Jak zapytanie coś zwróci to znaczy, że termin jest zajęty). Jeszcze ważna rzecz, że jeżeli rezerwacja kończy się danego dnia to tego samego dnia może zacząć się następna.

Przykład
rezerwacja 1: 10.04.2010 do 16.04.2010
rezerwacja 2: 3.04.2010 do 10.04.2010
rezerwacja 3: 18.04.2010 do 25.04.2010

Jak widać rezerwacja 2 kończy się 10.04, a rezerwacja 1 zaczyna 10.04 i jest to w porządku. Teraz stworzony został obiekt z rezerwacją od 17.04.2010 - 20.04.2010, taki termin nie może zostać zarezerwowany, bo koliduje z inną rezerwacją (z rezerwacja 3). Na podstawie danych z obiektu pobieram z bazy kolidujące z nią terminy, jak coś zostanie pobrane to znaczy, że termin jest już zajęty, jak nie zwróci to wszystko jest ok.
Mchl
Start i koniec 'nowej' imprezy musi być przed startem, lub po zakończeniu imprez istniejących, tak więc jeśli początek lub koniec nowej imprezy wypada pomiędzy początkiem i końcem imprezy istniejącej, wówczas mamy kolizję.

Kod
WHERE
($this->resFrom > resFrom AND $this->resFrom < resTo)
OR
($this->resTo > resFrom AND $this->resTo < resTo)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.