获取重叠预订mysql的详细信息

时间:2017-06-05 10:07:50

标签: mysql sql mysqli

我正在开发一个稳定的预订系统,用户可以预订和更新他们的房间预订,并从交互式地图中选择马厩。

我的稳定注册数据库结构如下所示

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

当用户更新预订但未更改checkInDatecheckOutDate时,我已经实施了一个简单的方案。

在上述情况下,如果用户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

1 个答案:

答案 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