Reputation: 77
I've got the following code:
SELECT
ROOM_DESCRIPTION_DESC AS "DESCRIPTION",
COUNT(ROOM_DESCRIPTION_ID) AS "AMOUNT"
FROM ROOM_TAB
JOIN ROOM_DESCRIPTION_TAB ON ROOM_DESCRIPTION = ROOM_DESCRIPTION_ID
JOIN RESERVATION_TAB ON RESERVATION_ROOM = ROOM_ID
WHERE RESERVATION_FROM NOT BETWEEN '2014-02-10' AND '2014-02-11'
GROUP BY ROOM_DESCRIPTION_DESC;
I basically want to find which rooms are not reserved between specific dates The problem is, that when there is no record in RESERVATION_TAB, the room is not even taken into consideration
ie.:
ROOM_TAB:
| ROOM_ID | ROOM_PRICE | ROOM_DESCRIPTION |
1 200 1
2 250 1
ROOM_DESCRIPTION_TAB:
| ROOM_DESCRIPTION_ID | ROOM_DESCRIPTION_DESC |
1 single room
RESERVATION_TAB:
| RESERVATION_ID | RESERVATION_FROM | RESERVATION_TO | RESERVATION_ROOM |
1 2014-02-14 2014-02-16 1
using the code I provided gives output:
| DESCRIPTION | AMOUNT |
single room 1
and this is the room with id 1, the second room seems not to exist
Upvotes: 1
Views: 1998
Reputation: 6866
You need a left join to try and find rooms without an applicable reservation record.
SELECT
ROOM_DESCRIPTION_DESC AS "DESCRIPTION",
COUNT(ROOM_DESCRIPTION_ID) AS "AMOUNT"
FROM ROOM_TAB
JOIN ROOM_DESCRIPTION_TAB ON ROOM_DESCRIPTION = ROOM_DESCRIPTION_ID
LEFT JOIN RESERVATION_TAB ON RESERVATION_ROOM = ROOM_ID
AND RESERVATION_FROM NOT BETWEEN '2014-02-10' AND '2014-02-11'
WHERE RESERVATION_ID IS NULL
GROUP BY ROOM_DESCRIPTION_DESC
Upvotes: 1
Reputation: 20935
You need a LEFT JOIN
to the RESERVATION_TAB
table, so it will include ALL Rows from ROOM_TAB
and the ones that are not in RESERVATION_TAB
will have Null
for the RESERVATION_FROM
date column.
SELECT
ROOM_DESCRIPTION_DESC AS "DESCRIPTION",
COUNT(ROOM_DESCRIPTION_ID) AS "AMOUNT"
FROM ROOM_TAB
JOIN ROOM_DESCRIPTION_TAB ON ROOM_DESCRIPTION = ROOM_DESCRIPTION_ID
LEFT JOIN RESERVATION_TAB ON RESERVATION_ROOM = ROOM_ID
WHERE RESERVATION_FROM NOT BETWEEN '2014-02-10' AND '2014-02-11'
GROUP BY ROOM_DESCRIPTION_DESC;
Upvotes: 3