这是我的表结构:
___房间
|--------|----------|
| 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
非常感谢我会收到的任何帮助。
答案 0 :(得分:0)
我建议您在应用程序中对此逻辑进行编程或重新设计数据库。您的表看起来像应该是对象,并且现在已经是所有事物的方式,没有简单或优雅的方法来获得所需的结果,并且您肯定无法在单个查询中做到这一点。最明显的是RAT_RoomsList列,它是表示列表的字符串。此外,如果预订日期范围内请求的多个房价重叠,您会怎么做?
我能想到的最简单的解决方案是将“费率”表合并到“可用性”表中,这样对于每个房间和日期组合,都会有一个费率。 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';
仅列出在此期间打开的房间及其价格的列表,您可以在应用程序中对其进行排序。