2

我正在为一个客户开发一个在线预订系统,我需要在该系统中找到他们的客户可以选择的可用预约时间来预订下一次预约。

我将尝试解释当前的数据库设置:

表名称:约会- 这些是客户当前预订的约会。

+----+----------+------------+------------+--------- -+--------------+------+------------+
| 编号 | 工作人员 | 日期 | 开始时间 | 结束时间 | 客户名 | 房间 | 治疗 |
+----+----------+------------+------------+--------- -+--------------+------+------------+
| 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 |
+---------+-----+-------------+-----------+------- ---+------------+

但不显示预订日期,只是空值。

有任何想法吗 ?

4

1 回答 1

-1

我不是为您提供技术解决方案,而是考虑将问题拆分为子查询。将子查询结果保存到“标志”变量中,然后像在事务中那样检查它们。还要考虑有一个预订确认阶段(一个管理页面)以避免预订冲突。

希望这可以帮助

于 2015-05-29T16:05:11.580 回答