我正在为一个客户开发一个在线预订系统,我需要在该系统中找到他们的客户可以选择的可用预约时间来预订下一次预约。
我将尝试解释当前的数据库设置:
表名称:约会- 这些是客户当前预订的约会。
+----+----------+------------+------------+--------- -+--------------+------+------------+ | 编号 | 工作人员 | 日期 | 开始时间 | 结束时间 | 客户名 | 房间 | 治疗 | +----+----------+------------+------------+--------- -+--------------+------+------------+ | 1 | 2 | 2015-08-24 | 09:00:00 | 10:00:00 | 史密斯先生 | 1 | 1 | | 2 | 2 | 2015-08-24 | 11:00:00 | 12:00:00 | 琼斯先生 | 2 | 1 | +----+----------+------------+------------+--------- -+--------------+------+------------+
表名称:staff - 员工列表、他们工作的星期几以及相关日期的轮班开始和结束时间。
+----+------+------------+------------+---------+ | 编号 | 姓名 | 星期几| 开始时间 | 结束时间 | +----+------+------------+------------+---------+ | 1 | 菲尔 | 1 | 09:00:00 | 17:00:00 | | 2 | 丽莎 | 5 | 09:00:00 | 18:00:00 | | 3 | 丽莎 | 3 | 09:00:00 | 17:00:00 | | 4 | 鲍勃 | 5 | 15:00:00 | 17:00:00 | +----+------+------------+------------+---------+
表名:治疗- 可用治疗的列表
+----+-------------+----------+ | 编号 | 姓名 | 持续时间 | +----+-------------+----------+ | 1 | 治疗 1 | 01:30:00 | | 2 | 治疗 2 | 01:00:00 | +----+-------------+----------+
表名:stafftreatments - 一个查找表,用于确定哪些员工进行了哪些治疗。
+----+-------+------------+ | 编号 | 员工 | 治疗 | +----+-------+------------+ | 1 | 1 | 1 | | 2 | 2 | 1 | +----+-------+------------+
因此,我们可以假设治疗 1 由工作人员 Lisa 进行,但 Lisa 仅在周三上午 9 点至下午 5 点以及周五上午 9 点至下午 6 点工作。Phil 也可以执行治疗 1,但仅在周一上午 9 点到下午 5 点之间工作。
在我的应用程序中,我询问用户他们希望预订什么治疗。例如,治疗 1 持续 90 分钟。然后,客户将选择他们希望预约的日期。所以在这个阶段,我们知道所需约会的时间长度和日期,然后是星期几。
我将选择选定的日期并在接下来的 5 天内每天循环
我一直在尝试开发一个查询,该查询将允许我根据包含预先预订的约会的约会表显示客户可以选择的所有可用时间段。
假设客户想要在 8 月 24 日预订治疗 1。我们知道一周中的一天是星期五,所以应该是 5,我们知道丽莎在星期五的上午 9 点到下午 6 点之间工作,但她已经在上午 9 点到下午 12 点之间进行了预约。
因为治疗时间为 90 分钟,所以我最终需要得到以下数据:
+----------+--------+----------------+------------- -+ | 日期 | 员工 | 可用开始 | 可用结束 | +----------+--------+----------------+------------- -+ | 24/08/15 | 丽莎 | 12:00 | 13:30 | | 24/08/15 | 丽莎 | 13:30 | 15:00 | | 24/08/15 | 丽莎 | 15:00 | 16:30 | | 24/08/15 | 丽莎 | 16:30 | 18:00 | | 24/08/15 | 鲍勃 | 15:00 | 16:30 | +----------+--------+----------------+------------- -+
然而,下一个问题是只有 4 个房间可用,因此不能同时预订超过 4 个疗程。
我看到了这篇文章——在 mysql 和 php 中找到空闲的时间块?
但我的退休稍微复杂一些,我不确定如何构建查询。任何帮助将不胜感激。
对结构进行了一些更改,我的查询如下:
SELECT trainer, day, bookingdate, from_time, to_time, 时间段 从 ( 选择一个培训师 , 一天 , 预定日期 , TIMEDIFF(start_time, IF(bookingdate=@prevdate,@prevend,open_time )) 作为时间段 , IF(bookingdate=@prevdate,@prevend,open_time ) 作为 from_time , start_time 为 to_time , @prevend := end_time 作为 prevend , @prevdate := bookingdate 作为 prevdate 从预订可用性 JOIN (SELECT @prevend:=null,@prevdate:=null) 作为初始化 INNER JOIN bookingscalendar c ON a.trainer = c.trainer AND WEEKDAY(c.bookingdate) = a.day 联盟 选择一个培训师 , 天 , 预定日期 , TIMEDIFF(close_time, IFNULL(MAX(end_time),open_time) ) 作为时隙 , IFNULL(MAX(end_time),open_time) 作为 from_time , close_time 为 to_time , null 作为预防 , null 作为 prevdate 从预订可用性 LEFT JOIN bookingscalendar c ON a.trainer = c.trainer AND WEEKDAY(c.bookingdate) = a.day GROUP BY a.trainer,day,bookingdate ) 作为间隙 WHERE 时隙 > '00:00:00' ORDER BY trainer, day, bookingdate, from_time;
使用以下数据:
+----+-------------+---------+------------+------- ---+-------------+------+------------+ | 编号 | 预订日期 | 教练 | 开始时间 | 结束时间 | 客户 ID | 房间 | 治疗 | +----+-------------+---------+------------+------- ---+-------------+------+------------+ | 1 | 2015-08-24 | 2 | 15:00:00 | 16:00:00 | 史密斯先生 | 1 | 1 | | 2 | 2015-08-31 | 2 | 16:00:00 | 17:00:00 | 琼斯先生 | 2 | 1 |
和
+-----------------+---------+-----+------------+--- ----------+--------------+ | 可用性_id | 教练 | 天 | 开放时间 | 关闭时间 | 培训师姓名 | +-----------------+---------+-----+------------+--- ----------+--------------+ | 4 | 1 | 2 | 09:00:00 | 17:00:00 | 丽莎 | | 6 | 1 | 4 | 09:00:00 | 17:00:00 | 丽莎 | | 7 | 1 | 5 | 09:00:00 | 17:00:00 | 丽莎 | +-----------------+---------+-----+------------+--- ----------+--------------+
返回的数据是:
+---------+-----+-------------+-----------+------- ---+------------+ | 教练 | 天 | 预订日期 | 从时间 | 到时间 | 时隙 | +---------+-----+-------------+-----------+------- ---+------------+ | 1 | 2 | 空 | 09:00:00 | 17:00:00 | 08:00:00 | | 1 | 4 | 空 | 09:00:00 | 17:00:00 | 08:00:00 | | 1 | 5 | 空 | 09:00:00 | 17:00:00 | 08:00:00 | +---------+-----+-------------+-----------+------- ---+------------+
但不显示预订日期,只是空值。
有任何想法吗 ?