我在我的数据库中有一个名为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) 

它返回给我的问题是复制的房间,即使它在特定预订的保留日期之间但不在另一个预订的保留日期之间仍然会将它返回给我。

我想要的是检查房间是否在同一时间或特定日期之间保留,如果是,我不希望它被选中并返回。

谢谢..抱歉我的英语不好

===============>>#1 票数:1

你在这里做的是交叉连接。 表a(Rooms)中的每一行都与表b(Reservations)中的每一行连接在一起。

为了使您的查询有效,您需要在where子句中指定Rooms.Rooms_Key = Reservations.Rooms_ForignKey(或显式连接[inner,left,right]并指定ON字段,因为在我看来它们更容易阅读- 显式 - vs-隐式更多信息)。

一旦转换了连接类型,where子句将开始为您提供更好的结果,如果您仍需要在那一点上,您应该能够修改它。

===============>>#2 票数: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 

它通过将房间加入到该房间的预订中,然后选择没有与新预订相冲突的预订的房间。(旧预订在新房间开始之前结束,或者在新房间之后开始一端没问题)。

  ask by FinalDark translate from so

未解决问题?本站智能推荐: