房间搜索sql查询

sam*_*ara 5 sql database

这是一个酒店代理的示例程序,他从各种酒店获得合同,并允许客户搜索和预订与他有合同的酒店(从而获得一些利润)。这是我的表模式。

CONTRACT (contract_id, hotel_id, valid_from, valid_to) 
ROOM (room_type, hotel_id, contract_id, price, max_adults_allowed, avail_rooms)
HOTEL (hotel_id, hotel_name, location)
Run Code Online (Sandbox Code Playgroud)

搜索时,界面类似hotels.com;即,例如,客户可以将其指定为“1 个房间有 2 个成人”和“1 个房间 2 个成人和 1 个房间 3 个成人”。

到目前为止,这是我的 sql 查询,

select h.name, h.location, r.type, r.price FROM HOTEL h, ROOM r, CONTRACT c 
WHERE c.contract_id = r.contract_id and c.hotel_id = h.hotel_id    --table joining
AND 'requested room lies within the contract valid period'  --check in and check out dates comparison
AND 'h.location is the user specified location' --requested location 
........
Run Code Online (Sandbox Code Playgroud)

我无法将房间搜索详细信息(如上所述)集成到此查询中。有人可以帮助我编写 sql 查询以包含房间规格。我正在使用 SQL Server。提前致谢。

dan*_*an3 1

假设您已经解析了“自然语言”输入,请按 max_adults 对您的请求进行分组,然后查询每种单独的类型;例如,对于“2 个房间 1 个成人和 3 个房间 2 个成人”,发出两个单独的查询(max_adults = 1,avail_rooms = 2)和(max_adults = 2,avail_rooms = 3)

select h.name, h.location, r.type, r.price, r.room_id FROM HOTEL h, ROOM r, CONTRACT c 
WHERE c.contract_id = r.contract_id and c.hotel_id = h.hotel_id
AND c.valid_from >= ? AND c.valid_to <= ? AND h.location = ?
AND r.max_adults = ? AND r.avail_rooms >= ?
Run Code Online (Sandbox Code Playgroud)

请注意,这只会找到max_adults 的完全匹配项,并且不会为您提供“预订不足”房间的选项。如果你想让客户预订大房间(并相应付费,而不是把房间订满),你可以使用以下策略:首先尝试原始查询,然后搜索更大的房间(通过添加“人造客人”)。

例如,如果原始请求是“1 个三元组、1 个双元组、1 个单元元”,请先尝试该操作,然后尝试“1 个三元组 2 个双元组”,然后“2 个三元组 1 个双元组”,然后“3 个三元组”。对于每个“修改的”查询,请使用上面的 SQL。第一个成功的选择对于客户来说将是最便宜的选择。

尽管这涉及多个 SQL 事务,但每个事务都有简单的连接,并且可能比复杂的语句运行得更快。

如果您有更多的控制权,您可能会更改架构以单独考虑每个房间:

ROOM (room_id, room_type, hotel_id, contract_id, price, max_adults_allowed)
BOOKING (room_id, checkin, checkout)
Run Code Online (Sandbox Code Playgroud)