回答

收藏

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

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

我有一个酒店预订系统的查询,当有特定房间时,我需要查找日期。(这是一家精品酒店,人们在其中预订特定的房间,因此在获得此代码之前,他们知道他们想要的确切房间。
- V- G2 J3 V' i/ p. J2 X我要查找的结果是一个房间的详细信息,我在查询中指定了一个房间-我是不查找多个房间的信息。$ ^3 Z; M# l4 j% u2 L/ g
“可用性”表模式很简单,每一行是:
  N% H, j- H% Hroom_id; E0 _0 u- _4 n5 ^
date_occupied - a single day that is occupied (like '2011-01-01')
1 t: q+ l! l4 m  q( Z* I因此,例如,如果某个房间在1月1日至1月5日期间被占用,则将五行添加到可用性表中,每一天占据该房间。
! q5 k# b2 U7 ]/ A这是我要解决的问题:9 z* Y2 `" L, P: t$ M
查询以查找在开始日期和结束日期之间何时有特定房间可用的查询,例如:  V- {! y& g! x/ ~3 J

/ g# q" w$ \, y; e* e9 a7 F; G/ O) N  ]! g
SELECT rooms.* FROM rooms, availability7 ^: T/ O9 }3 @2 L+ ]  C5 u$ a
WHERE rooms.id = 123
* R; Q. z. ^. J   AND availability.room_id = rooms.id
0 O1 G/ v9 J# P& A/ x- N5 L* |   AND nothing between start_date and end_date is in+ R5 e& Q9 R" q7 A( ^. F! l3 i
availability.date_occupied# j& w2 Q, U  N( |

7 [, w. J) I: x- i* p3 K

7 p+ e, @- @" K/ m2 r我也在寻找一个类似的查询,我只想查看在开始日期和接下来的两天是否有可用的特定房间,例如:
3 V9 x' y" i# |& n  g  c6 z* z* E; l

+ V! t+ N" I  K, }: k- u5 g, u( C: P$ M
SELECT rooms.* FROM rooms, availability+ ]* ~% Q) D4 t; O% L
WHERE rooms.id = 123
: f2 m. T, u, e, J   AND availability.room_id = rooms.id3 c. C5 K0 ~1 p% @: l/ h
   AND start_date, start_date+1day and start_date+2days is not in+ J$ z5 q# V% Y2 x, d
availability.date_occupied# s: f. Y: \# H; S* s1 G

* K  {1 r: S" I% t
3 n4 H" [( [/ S$ }& e( ~- _
我有点想找出确切的联接。有什么建议?请注意,如果有帮助,我完全可以使用可用性表的其他模式。无论哪种方式,查询都能最有效地工作。
# ~5 q# o2 u1 ^  j8 W# M0 q               
+ q) @. ?  g2 C解决方案:
7 `) w+ ]9 m) j               
$ a4 t7 n2 T" o% f( i& N8 \5 m: o/ j* u9 K6 j
) V9 x. [8 O% ~
                我认为,执行此操作的最佳方法是简单地运行查询以查看是否有房间被占用,并在不返回任何行的情况下指示可用性。' X5 [/ _2 {9 q6 B5 V' ~
因此,对于您的第一个查询:. j% L3 J9 V; n6 `
SELECT COUNT(id) AS occupied_days FROM availability
0 @5 M8 S" k  F5 U: XWHERE room_id = 123
6 Q8 Z/ p9 p" S8 S7 U: B6 n& Q+ `      AND date_occupied BETWEEN @start_date AND @end_date;
6 k) ]. X! r) x2 X如果occupied_days == 0可以的话。
9 h" o, M! L* I2 {对于第二个查询,只需替换@end_date为DATE_ADD(@start_date, @num_days)2 p1 @# K* A1 p& r( J
对于涉及联接的答案仅作一些评论:由于将搜索限制在特定范围内room_id,因此将availability表联接到room表是没有意义的,因为它没有提供必要的信息。所有这些LEFT; A0 T7 {; J% q$ ~
JOIN都使查询变得复杂, 可能会降低 性能,并且没有任何用处。! x; P+ F% O  o: m
另外,虽然您可能不愿先搜索占用率然后推断出可用性,但我猜想此查询是迄今为止查询引擎优化最快和最容易的方法,因为它基于单个列(如果建立索引),会使事情变得更快。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则