根据其他2张桌子归还可用房间

时间:2019-04-12 03:50:37

标签: mysql

这是我的表结构:

___房间

|--------|----------|
| ROO_Id | ROO_Name |
|--------|----------|
|      1 |     Blue |
|      2 |      Red |
|      3 |   Yellow |
|--------|----------|

___费率

|--------|---------------|-------------|-----------|-------------------|---------------|
| RAT_Id | RAT_DateStart | RAT_DateEnd | RAT_Price | RAT_RoomsAffected | RAT_RoomsList |
|--------|---------------|-------------|-----------|-------------------|---------------|
|     90 |    2019-04-01 |  2019-05-01 |    139.00 |               all |               |
|     91 |    2019-05-01 |  2019-12-31 |    159.00 |              list |           1,2 |
|     92 |    2019-05-01 |  2019-12-31 |    129.00 |              list |             3 |
|--------|---------------|-------------|-----------|-------------------|---------------|

___可用性

|--------|------------|------------|------------|
| AVA_Id | AVA_RoomId | AVA_Status | AVA_Date   |
|--------|------------|------------|------------|
|    203 |          1 |       Open | 2019-04-01 |
|    204 |          1 |       Open | 2019-04-02 |
|    205 |          1 |       Open | 2019-04-03 |
|    206 |          1 |       Open | 2019-04-04 |
|    207 |          1 |       Open | 2019-04-05 |
|    208 |          1 |      Close | 2019-04-06 |
|    209 |          1 |      Close | 2019-04-07 |
|--------|------------|------------|------------|

以下是这3个表格的简要说明:

  • _Rooms包含有关我可以在酒店租用的房间的信息。
  • ___Rates包含我可以在特定期间和房间申请的房价信息(如果RAT_RoomsAffected设置为all,则意味着该房价可以应用于我在酒店拥有的所有客房。如果RAT_RoomsAffected为设置为列表,则该比率只能应用于RAT_RoomsList字段中的房间ID。
  • 每天
  • ___Availabilities列出预订此房间的可能性(开放)或关闭房间的可能性(关闭)。

我的问题如下:

我想列出符合以下两个条件的房间:

  • 对于客户要在我的酒店预订的日期,这些房间的状态应为Open(AVA_Status)。例如,从2019-04-02到2019-04-04(2晚)。

  • 此会议室应与_Rates表中的费率链接。因此,根据客户的入住日期,我需要进入此表并查找该期间的房价。

  • 最后,找到的费率应与第一步中找到的ROO_Id相匹配。如果ROO_Id或在RAT_RoomsAffected = all列表中找到此ROO_Id,则RAT_RoomsList可以匹配。


期望的输出应该是从2019-04-02到2019-04-04的输出:

|--------|----------|-----------|
| ROO_Id | ROO_Name | RAT_Price |
|--------|----------|-----------|
|      1 |     Blue |    139.00 |
|--------|----------|-----------|

这是可以帮助您的SQLFiddle: https://www.db-fiddle.com/f/kPY6FmKw1SZJjTHUbLj5Pe/0

非常感谢我会收到的任何帮助。

1 个答案:

答案 0 :(得分:0)

我建议您在应用程序中对此逻辑进行编程或重新设计数据库。您的表看起来像应该是对象,并且现在已经是所有事物的方式,没有简单或优雅的方法来获得所需的结果,并且您肯定无法在单个查询中做到这一点。最明显的是RAT_RoomsList列,它是表示列表的字符串。此外,如果预订日期范围内请求的多个房价重叠,您会怎么做?


因为这是用mysql标记的

我能想到的最简单的解决方案是将“费率”表合并到“可用性”表中,这样对于每个房间和日期组合,都会有一个费率。 Rates表将变得多余。

然后您可以查询:

SELECT AVA_RoomId, SUM(RAT_price)
FROM   ___Availabilities
WHERE  AVA_Status = 'Open' AND
       AVA_Date >= '2019-04-02' AND
       AVA_Date < '2019-04-04'
GROUP BY AVA_RoomId
HAVING COUNT(AVA_RoomId) = DATEDIFF('2019-04-04', '2019-04-02');

住宿总价,或:

SELECT AVA_RoomId, AVA_Date, RAT_price
FROM   ___Availabilities
WHERE  AVA_Status = 'Open' AND
       AVA_Date >= '2019-04-02' AND
       AVA_Date < '2019-04-04';

仅列出在此期间打开的房间及其价格的列表,您可以在应用程序中对其进行排序。

db-fiddle