我正在开发一个稳定的预订系统,用户可以预订和更新他们的房间预订,并从交互式地图中选择马厩。
我的稳定注册数据库结构如下所示
event_detail_stable_registrations
| id | accountId | eventId | stableId | checkInDate | checkOutDate |
5 233 55 66 26-06-2017 28-06-2017
6 234 55 66 28-06-2017 29-06-2017
当用户更新预订但未更改checkInDate
和checkOutDate
时,我已经实施了一个简单的方案。
在上述情况下,如果用户234
更新预订并更改checkInDate
,则查询应返回233
stableId 66
,但我的查询返回' 234&#39 ;作为accountId
另一种情况是用户更改注册的checkInDate
和/ checkOutDate
。用户A想要更改预订详细信息,如何检查用户预订的更新checkInDate
和/或checkOutDate
是否有任何重叠,如果已经预订,那么accountId
已预订预订了它。
现在我正在运行以下查询,该查询为我提供了有关重叠日期的正确信息,但无法获取已预订日期的帐户信息。
查询始终返回用户的重叠日期的accountId。
SET @checkInDate = '2017-04-27 14:00:00' , @checkOutDate = '2017-05-01 10:00:00' ;
SELECT a.*,
IF(b.`stableid` IS NULL,"Avalalable","Not Available") as `status`,
IF(NOT b.`stableid` IS NULL,b.`accountId`,"") as `overLapAccount`,
IF(NOT b.`stableid` IS NULL,b.`checkInDate`,"") as `start_overlap`,
IF(NOT b.`stableid` IS NULL,b.`checkOutDate`,"") as `end_overlap`
FROM `event_detail_stable_registrations` b
LEFT JOIN `stables` a
ON a.`id` = b.`stableid` AND
(((`checkInDate` BETWEEN @checkInDate AND @checkOutDate)
OR (`checkOutDate` BETWEEN @checkInDate AND @checkOutDate))
OR ((@checkInDate BETWEEN `checkInDate` AND `checkOutDate`)
OR (@checkOutDate BETWEEN `checkInDate` AND `checkOutDate`))
)
ORDER BY a.`name`
这是SQL fiddle,我没有使用相同的数据库结构但它的相似。
我在同一时间段内为多个帐户预订的同一stable
获得的输出很好,但对于我正在使用的查询,我在null
列中得到name,stableId
。
答案 0 :(得分:0)
场景的第 2 部分:
MariaDB-10.5 Application Time Periods - WITHOUT OVERLAPS 可以强制执行非重叠预订的约束:
ALTER TABLE event_detail_stable_registrations
ADD period FOR booking(checkInDate, checkOutDate),
ADD PRIMARY KEY (accountId, stableId, booking WITHOUT OVERLAPS)
取消一天的用户只是:
DELETE
FROM event_detail_stable_registrations
FOR PORTION OF booking
FROM '2017-04-29 14:00:00' TO '2017-04-30 10:00:00'
WHERE accountId=5
AND stableId=866
将未删除的日期预订条目拆分为多个时期。
预订的任何更新都会强制执行约束。
参考:dbfiddle