mysql 查询获取在未给出预期结果的日期范围内未预订的所有房间
mysql query for getting all rooms which are not booked between a date range not giving expected results
我正在创建一个预订系统,它有 2 个表
房间
id | name | no_of_rooms
1 | Lake View | 4
2 | Royale | 2
3 | Sky View | 6
预订
id |room_id | start | end | total_rooms
4 |1 | 2015-08-13 | 2015-08-14 | 2
5 |2 | 2015-08-20 | 2015-08-22 | 1
6 |2 | 2015-08-01 | 2015-08-13 | 1
并且在搜索页面上创建新预订时,我想查找在此日期范围内可用的可用房间
搜索值
开始时间:2015-08-11
结束:2015-08-12
预期结果
id | name | no_of_rooms | available_rooms
1 | Lake View | 4 | 4
2 | Royale | 2 | 1
3 | Sky View | 6 | 6
我得到的结果
id | name | no_of_rooms | available_rooms
1 | Lake View | 4 | 0
2 | Royale | 2 | 1
3 | Skyview | 6 | 0
这是我为房间可用性编写的代码
SELECT
r.id,
r.name,
r.no_of_rooms,
IFNULL(sum(b.total_rooms),0) as available_rooms
FROM rooms r
LEFT JOIN bookings b ON r.id = b.room_id AND
(
(b.start <= "2015-08-11" AND b.end >= "2015-08-11")
OR
(b.start <= "2015-08-12" AND b.end >= "2015-08-12")
)
GROUP BY r.id
我也不想显示不可用rooms.No不管怎样我都试过了结果完全wrong.Hope大家帮帮我吧!
你可以试试:
SELECT r.id AS roomID, r.name, r.no_of_rooms,
r.no_of_rooms - COALESCE(t.bookedRooms,0) AS available_rooms
FROM rooms AS r
LEFT JOIN (
SELECT room_id, SUM(total_rooms) AS bookedRooms
FROM bookings
WHERE `start` < '2015-08-14' AND `end` > '2015-08-11'
GROUP BY room_id ) AS t
ON r.id = t.room_id
WHERE r.no_of_rooms - COALESCE(t.bookedRooms,0) > 0
查找指定期间的预订房间的关键是以下谓词:
`start` <= '2015-08-12' AND `end` >= '2015-08-11'
以上获取所有预定时间段与指定时间段重叠的房间,即使是一天。
在 room_id
上使用 GROUP BY
我们可以得到 指定期间每个 room_id
预订房间的总和。
要获得预期的结果集,我们只需对导出的 table 预订聚合进行 LEFT JOIN
,然后简单地从可用房间数中减去预订房间的总和。
我正在创建一个预订系统,它有 2 个表
房间
id | name | no_of_rooms
1 | Lake View | 4
2 | Royale | 2
3 | Sky View | 6
预订
id |room_id | start | end | total_rooms
4 |1 | 2015-08-13 | 2015-08-14 | 2
5 |2 | 2015-08-20 | 2015-08-22 | 1
6 |2 | 2015-08-01 | 2015-08-13 | 1
并且在搜索页面上创建新预订时,我想查找在此日期范围内可用的可用房间
搜索值 开始时间:2015-08-11 结束:2015-08-12
预期结果
id | name | no_of_rooms | available_rooms
1 | Lake View | 4 | 4
2 | Royale | 2 | 1
3 | Sky View | 6 | 6
我得到的结果
id | name | no_of_rooms | available_rooms
1 | Lake View | 4 | 0
2 | Royale | 2 | 1
3 | Skyview | 6 | 0
这是我为房间可用性编写的代码
SELECT
r.id,
r.name,
r.no_of_rooms,
IFNULL(sum(b.total_rooms),0) as available_rooms
FROM rooms r
LEFT JOIN bookings b ON r.id = b.room_id AND
(
(b.start <= "2015-08-11" AND b.end >= "2015-08-11")
OR
(b.start <= "2015-08-12" AND b.end >= "2015-08-12")
)
GROUP BY r.id
我也不想显示不可用rooms.No不管怎样我都试过了结果完全wrong.Hope大家帮帮我吧!
你可以试试:
SELECT r.id AS roomID, r.name, r.no_of_rooms,
r.no_of_rooms - COALESCE(t.bookedRooms,0) AS available_rooms
FROM rooms AS r
LEFT JOIN (
SELECT room_id, SUM(total_rooms) AS bookedRooms
FROM bookings
WHERE `start` < '2015-08-14' AND `end` > '2015-08-11'
GROUP BY room_id ) AS t
ON r.id = t.room_id
WHERE r.no_of_rooms - COALESCE(t.bookedRooms,0) > 0
查找指定期间的预订房间的关键是以下谓词:
`start` <= '2015-08-12' AND `end` >= '2015-08-11'
以上获取所有预定时间段与指定时间段重叠的房间,即使是一天。
在 room_id
上使用 GROUP BY
我们可以得到 指定期间每个 room_id
预订房间的总和。
要获得预期的结果集,我们只需对导出的 table 预订聚合进行 LEFT JOIN
,然后简单地从可用房间数中减去预订房间的总和。