Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Pomoc przy stworzeniu zapytania
Forum PHP.pl > Forum > Bazy danych > MySQL
KorWojci
Witam,

w mojej bazie danych mam 2 tabele tworzone takimi zapytaniami:
  1. CREATE TABLE Order_Rooms
  2. (
  3. ID_OR INT NOT NULL AUTO_INCREMENT,
  4. ID_Room INT NOT NULL,
  5. DateFrom DATE NOT NULL,
  6. DateTo DATE NOT NULL,
  7. PRIMARY KEY(ID_OR),
  8. FOREIGN KEY(ID_Room) REFERENCES Rooms(ID_Room)
  9. )
  10.  
  11. CREATE TABLE Rooms
  12. (
  13. ID_Room INT NOT NULL AUTO_INCREMENT,
  14. Capacity INT NOT NULL,
  15. StandardPrice DECIMAL(9,2),
  16. PRIMARY KEY(ID_Room)
  17. )


Chodzi o to, że w tabeli Order_Rooms przechowywane jest ID_Room i daty w jakich jest on zarezerwowany. Próbuję stworzyć zapytanie, które będzie mi zwracało ID_Rooms, które jest "wolne" w danym okresie czasu (mam 2 daty pobrane, powiedzmy data1 i data2). Stworzyłem zapytanie, które co prawda pokazuje tylko te rekordy, które są zajęte poza wybranym okresem ale niestety wyświetla też ID_Room tego, które jest zajęte.
Żeby zobrazować to powiedzmy że w Order_Rooms mamy takie rekordy:
  1. 1 1 '2015-01-13' '2015-01-15'
  2. 2 2 '2015-02-18' '2015-02-21'
  3. 3 1 '2015-02-10' '2015-02-13'

I powiedzmy, że pokój z ID=3 w ogóle nie jest zarezerwowany. Chcemy sprawdzić czy jest jakiś wolny pokój w terminie od '2015-01-12' do '2015-01-16' czyli wszystkie ID_Room, które są w tabeli Rooms i nie są zajęte w tym terminie. I moje zapytanie zwraca mi tylko coś takiego (wyświetlam wszystko żeby zobrazować):
  1. 2 2 '2015-02-18' '2015-02-21'
  2. 3 1 '2015-02-10' '2015-02-13'

A powinno zwrócić tylko 2 id (ID_Room=2 i ID_Room=3)
Zapytanie wygląda tak:
  1. SELECT Rooms.ID_Room, Order_Rooms.DateFrom, Order_Rooms.DateTo FROM Rooms LEFT JOIN Order_Rooms ON Rooms.ID_Room=Order_Rooms.ID_Room WHERE DateFrom>='2015-01-13' OR DateTo<='2015-01-10'

Możecie mi pomóc z tym zapytaniem? Mam nadzieję, że w miarę trafnie to wytłumaczyłem.



Gdyby ktoś miał podobny problem wrzucam swoje rozwiązanie smile.gif
  1. SELECT Rooms.ID_Room, Order_Rooms.DateFrom, Order_Rooms.DateTo FROM Rooms LEFT JOIN Order_Rooms ON Rooms.ID_Room=Order_Rooms.ID_Room WHERE Rooms.ID_Room NOT IN (SELECT Rooms.ID_Room FROM Rooms LEFT JOIN Order_Rooms ON Rooms.ID_Room=Order_Rooms.ID_Room WHERE DateFrom BETWEEN 'data1' AND 'data2' OR DateTo BETWEEN 'data1' AND 'data2')
mmmmmmm
http://sqlfiddle.com/#!2/34dfa/1
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.