我的数据库中有一个名为rooms的表,其中包含房间信息和属性,另一个名为预约表的表包含Room Reserved,FromDate和ToDate。
我想要做的是让用户选择他想要预订的房间大小并选择预订房间的日期,然后我根据房间预订表向他提供可用的房间。
这里我做了什么:
SELECT * FROM Rooms,Reservations WHERE
Rooms.R_Size = 'roomSize' AND ('4/19/2013' NOT
BETWEEN Reservation.FromDate AND Reservation.ToDate AND '4/19/2013'
NOT BETWEEN Reservation.FromDate AND Reservation.ToDate)
它返回给我的问题是复制的房间,即使它在特定预订的保留日期之间,但不在另一个预订的保留日期之间,它仍会将它返回给我。
我想要的是检查房间是在同一时间还是在指定日期之间保留,如果是,我不希望它被选中并返回。
谢谢..抱歉我的英语很差
答案 0 :(得分:1)
你在这里做的是一个交叉连接。表a(房间)中的每一行都与表b(预订)中的每一行连接。
为了使您的查询有效,您需要在where子句中指定Rooms.Rooms_Key = Reservations.Rooms_ForignKey(或显式连接[inner,left,right]并指定ON字段,因为它们更易于阅读在我看来 - explicit-vs-implicit了解更多信息)。
一旦转换了连接类型,where子句将开始为您提供更好的结果,如果您仍然需要,则应该能够修改它。
答案 1 :(得分:1)
您的查询有两个问题。一个是房间和预订之间的连接没有条件,因此对于满足日期测试的每个预订,将返回正确大小的房间一次。另一个问题是您的日期测试错误,因为它不会检测到完全在新预订的日期间隔内的现有预订。
像这样的查询会给你想要的结果:
SELECT * FROM Rooms
LEFT JOIN Reservations
ON Reservations.R_Number = Rooms.Number
AND Reservations.ToDate > '4/19/2013'
AND Reservations.FromDate < '4/20/2013'
WHERE Rooms.R_Size = 'roomSize'
AND Reservations.R_Number IS NULL
通过将房间加入到该房间的预订中,然后选择没有与新预订相冲突的预订的房间。(旧预订在新房间开始之前结束,或者开始新的结束后没有问题)。