回答

收藏

酒店预订系统SQL查询:确定何时可以使用一个特定的房间

技术问答 技术问答 56 人阅读 | 0 人回复 | 2023-09-13

我有一个酒店预订系统的查询,当有特定房间时,我需要查找日期。(这是一家精品酒店,人们在其中预订特定的房间,因此在获得此代码之前,他们知道他们想要的确切房间。2 J6 a! p- G# s3 M# k2 E
我要查找的结果是一个房间的详细信息,我在查询中指定了一个房间-我是不查找多个房间的信息。) \  w; k: f$ c
“可用性”表模式很简单,每一行是:- m$ O: i8 W: T2 c, _! l
room_id. X- U2 v0 F' H$ B- B, E" z
date_occupied - a single day that is occupied (like '2011-01-01')0 S8 I3 O7 D! T5 E
因此,例如,如果某个房间在1月1日至1月5日期间被占用,则将五行添加到可用性表中,每一天占据该房间。# O2 U# D2 R( D' j6 a
这是我要解决的问题:3 k) b- P' [0 ?! u3 F- o9 c
查询以查找在开始日期和结束日期之间何时有特定房间可用的查询,例如:
& c' O7 }5 s! B. S- ~" ^" S( q
! ^  }! }9 Y% O" V1 |) D* w

: R$ P  M( H/ c- g7 `: z2 fSELECT rooms.* FROM rooms, availability
5 e* G( b$ `2 b: b+ M WHERE rooms.id = 123* R" f" _7 _$ k8 y" y
   AND availability.room_id = rooms.id
; ]5 u' _. d- E7 D$ Z% A   AND nothing between start_date and end_date is in* `2 v$ \2 s$ _& D8 H0 V, G
availability.date_occupied( s" u( j9 X2 y3 i, c
1 J. J) ?4 G9 {! w* ~) D1 d
0 f1 Q# l/ E; ]5 l
我也在寻找一个类似的查询,我只想查看在开始日期和接下来的两天是否有可用的特定房间,例如:
% [4 l. R. V# s& h4 ^: u9 u
# v& H3 m/ p- u" e$ r5 O

- t3 E% F) n/ n0 H/ XSELECT rooms.* FROM rooms, availability' Q* D$ W3 a* J3 X
WHERE rooms.id = 123
# E8 W% ^/ w) F   AND availability.room_id = rooms.id
% C, V3 x% d8 t2 A+ P* p9 O   AND start_date, start_date+1day and start_date+2days is not in8 W/ W( w, O; T7 F, h
availability.date_occupied! }; a5 k6 Q* }( O, D% o( C) Y6 U8 X

2 g  R9 C+ Q. C: d, D
: s, f, c9 r: g* f. q7 z
我有点想找出确切的联接。有什么建议?请注意,如果有帮助,我完全可以使用可用性表的其他模式。无论哪种方式,查询都能最有效地工作。
) c( T8 Q, G5 F               
4 i3 R/ R) z, I7 A% v解决方案:" O7 W& X) g% _3 ~! d
                9 X' {- |5 ]$ @

& a  E* Y4 X5 H/ d
/ J  P1 z' g. c4 {  K: J                我认为,执行此操作的最佳方法是简单地运行查询以查看是否有房间被占用,并在不返回任何行的情况下指示可用性。9 e% V. b# q/ t
因此,对于您的第一个查询:  N% N6 O* [: l
SELECT COUNT(id) AS occupied_days FROM availability
% j" y( |" ^, ?: ^# n3 oWHERE room_id = 123
* g, u9 t' h8 Z) Z( D* `+ H$ f1 S      AND date_occupied BETWEEN @start_date AND @end_date;
; ~% \, u& n/ z0 Y. {! ~如果occupied_days == 0可以的话。- q: v0 ]# o7 ?9 G
对于第二个查询,只需替换@end_date为DATE_ADD(@start_date, @num_days); a2 s9 r0 i9 B) V5 H
对于涉及联接的答案仅作一些评论:由于将搜索限制在特定范围内room_id,因此将availability表联接到room表是没有意义的,因为它没有提供必要的信息。所有这些LEFT
. \1 ~$ U! U6 [0 C1 xJOIN都使查询变得复杂, 可能会降低 性能,并且没有任何用处。3 l( o6 b9 P* O4 z
另外,虽然您可能不愿先搜索占用率然后推断出可用性,但我猜想此查询是迄今为止查询引擎优化最快和最容易的方法,因为它基于单个列(如果建立索引),会使事情变得更快。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则