【问题标题】:mysql query for getting all rooms which are not booked between a date range not giving expected resultsmysql查询用于获取在未给出预期结果的日期范围内未预订的所有房间
【发布时间】:2015-08-21 14:08:20
【问题描述】:

我正在创建一个预订系统,它有 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

我也不希望显示不可用的房间。无论我尝试什么结果都是完全错误的。希望你们能帮助我!

【问题讨论】:

    标签: mysql sql group-by left-join


    【解决方案1】:

    你可以试试:

    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 预订房间的总和

    要获得预期的结果集,我们可以使用派生的预订汇总表执行LEFT JOIN,然后简单地从可用房间数中减去预订房间的总和。

    Demo here

    【讨论】:

    • 试过了,但它不起作用我不知道如何格式化 cmets 部分的代码,你能看看这个吗? pastebin.com/WUBJAhZp
    • 如果我将预订 4 的 total_rooms 与 room_id 1 更改为 4(所有房间),请查看我的 pastebin 代码,当我在日期 start end >= '2015-08-14' 应该为该房间提供 0 个可用房间,目前它提供 3 个可用房间。
    • 对于房间 1,它不应该显示在该日期范围内,因为所有房间都已被占用,对于房间 2,它应该显示 1 个可用房间这是我得到的结果 i.imgur.com/keCvEXk.png 我为我的错误道歉英文但希望你能看懂,如果不是我应该稍后在 sqlfiddle 中发帖吗?
    • @user3407278 我想我已经解决了这两个问题。请检查我所做的修改。
    • 它现在似乎正在工作。我正在检查所有案例。非常感谢@Giorgos Betsos。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多