【发布时间】:2016-06-02 00:06:15
【问题描述】:
我已仔细阅读了此处有关此主题的所有帖子,但我的问题有一个额外的问题,我需要为每个房间准备可用床位,因为它是一个旅馆,并且一些房间是共用的。
现在我尝试在PHP 中执行此操作,但后来意识到我什至没有考虑日期范围。所以现在我在想,因为我已经有一个查询,可以检索给定日期范围内发生的所有预订,然后将检索到的房间及其床铺与房间表进行比较,并仅显示未占用的房间及其床铺。但我不知道如何解决床位问题,因为它们不是一个实体,只是每个房间的床位总数。但随后预订会说明预订房间中的哪张床..
这是我的桌子
房间
预订
现在我用来检索所有预订房间及其床位的查询是
SELECT rooms_id, bed
FROM reservations
WHERE `to` > '2016-02-18' AND `from` < '2016-02-24'
第一个日期,如果我的输入变量 $from 和第二个日期是输入变量 $to 并且它不仅允许检索具有从 $from 和 $to 开始的预订的房间,而且还允许检索在该日期之前开始的所有预订范围并在内部结束,在日期范围之内开始并在日期范围之后结束,最后是在日期范围之前和之后结束的预订。所以上面这个确切的查询将返回下表
但这就是我卡住的地方。我不知道如何匹配我拥有的数据以找到所有可用的房间,但还有床。 从 '2016-02-18' 到 '2016-02-24' 的日期范围所需的 AVAILABLE ROOMS 表应如下所示:
|||||||||||||||||||||||||||||||||
|| rooms_id || bed_number ||
||||||||||||||||||||||||||||
|| 1 || 1 ||
----------------------------
|| 1 || 2 ||
----------------------------
|| 2 || 5 ||
----------------------------
|| 2 || 6 ||
----------------------------
|| 2 || 7 ||
----------------------------
|| 2 || 8 ||
----------------------------
您可以在图片中看到它在我的应用中的外观。两个日期之间唯一可用的房间和床位是豪华房及其床号 1 和床号 2,宿舍房间床位为 5、6、7、8,因为 1-4 至少有一个预订想要的日期
我唯一的想法是使用 NOT IN,但这只有在我不关心床并且输出在这里的情况下才有效
SELECT *
FROM `rooms`
WHERE `id` NOT IN
(SELECT rooms_id FROM reservations WHERE `to` > '2016-02-18' AND `from` < '2016-02-24')
而不是我上面“草绘”的内容
对于如何处理此问题的任何提示和想法,我将不胜感激。 我的一部分担心这一切都归结为我没有将床视为实体并且必须这样做,即使我将永远不会在床上存储任何类型的信息,例如它们的颜色,位置,质量,价格等......
回复@Paul-Spiegel
这太棒了,但是有什么方法可以将免费床位作为数字而不是总数来获得。因为当这个人进行预订时,我必须将其分配到床上。所以如果结果可以是
| room_id | title | beds_total | available_bed_nrs |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 1 | luxury room | 2 | 1, 2 |
| 2 | dorm room | 8 | 5, 6, 7, 8 |
而不是
【问题讨论】:
-
“但随后预订会说明该预订是针对房间中的哪张床位进行的。”在这种情况下,它们是一个实体!
-
您应该使用您的数据 abd 架构从 sqlfiddle.com 制作一个 sqlfiddle,以便专家可以轻松帮助您
-
@Strawberry 好的,但只能在餐桌上预订,对吗?因为桌子房间只说明每个房间有多少张床
-
一位客人到达一个房间,该房间已被占用,但所有床铺都已铺好,其他房客不在。客人怎么知道哪张床是他们的?
-
@Strawberry 你让我很担心,但我刚刚向旅馆确认,他们不在乎这个人睡哪张床。他们只会在每张可用的床上放一张便条。