w mojej bazie danych mam 2 tabele tworzone takimi zapytaniami:
CREATE TABLE Order_Rooms ( ID_OR INT NOT NULL AUTO_INCREMENT, ID_Room INT NOT NULL, DateFrom DATE NOT NULL, DateTo DATE NOT NULL, PRIMARY KEY(ID_OR), FOREIGN KEY(ID_Room) REFERENCES Rooms(ID_Room) ) CREATE TABLE Rooms ( ID_Room INT NOT NULL AUTO_INCREMENT, Capacity INT NOT NULL, StandardPrice DECIMAL(9,2), PRIMARY KEY(ID_Room) )
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 '2015-01-13' '2015-01-15' 2 2 '2015-02-18' '2015-02-21' 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ć):
2 2 '2015-02-18' '2015-02-21' 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:
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

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')