我正在使用 MySQL 中的预订系统,但在查找下一个可用的预约空档时遇到了一些麻烦。
我的日子被分成 15 分钟的时段(00:00:00 - 00:14:59、00:15:00 - 00:29:59 等)。到目前为止的表结构:
约会表:
CREATE TABLE IF NOT EXISTS `appointments` (
`appointmentID` int(9) unsigned NOT NULL AUTO_INCREMENT,
`patientID` int(9) unsigned NOT NULL,
`apptTitle` varchar(50) NOT NULL,
`apptDT` datetime NOT NULL,
`apptLength` int(4) NOT NULL,
`apptStatus` varchar(25) NOT NULL,
`physician` int(9) unsigned NOT NULL,
`apptType` varchar(30) NOT NULL,
`apptLocation` varchar(25) NOT NULL,
PRIMARY KEY (`appointmentID`),
KEY `patientID` (`patientID`),
KEY `physician` (`physician`),
KEY `apptStatus` (`apptStatus`),
KEY `apptLocation` (`apptLocation`),
KEY `apptType` (`apptType`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
apptSlots 表:
CREATE TABLE IF NOT EXISTS `apptSlots` (
`startDT` datetime NOT NULL,
`endDT` datetime NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
apptSlots 表已经填满了 2012 年的所有 15 分钟时段,正如我在上面解释的那样。
我有一个查询可以成功地向我显示未以任何方式占用的插槽(根本没有安排约会)。
SELECT a.*
FROM apptSlots AS a
LEFT JOIN appointments AS b
ON a.endDT
BETWEEN b.apptDT AND DATE_ADD(b.apptDT, INTERVAL b.apptLength MINUTE)
AND b.appointmentID IS NULL
我现在需要做的是跨多个医生、多个房间等搜索预约时段。例如,如果医生 A 预约早上 7 点 - 早上 8 点,则该时间段不再显示在我上面的查询中。但医师 B 和 C 没有任何预约该时段,所以我需要能够安排他们。房间也是如此,早上 7 点的预约使用房间 A,但房间 B 和 C 仍然可以自由安排。
如何确定所有这些变量的开放槽?我知道我可以针对每种组合使用 WHERE 条件进行测试,如果我需要针对特定的医生或特定的治疗室进行测试,这将有效。但是,如果我只想查看所有医生和房间的所有插槽,我的查询不起作用并且单独测试所有可能的组合似乎不正确,这只是如何将正确的条件放入 LEFT JOIN 子句的问题.
如果我不清楚,请告诉我,但我认为这是足够的信息。如果没有,我会添加任何你要求的东西!
感谢您的帮助,我之前的问题在这里得到了我上面的查询,现在我只需要一些改进。有什么问题可以问,我会来解答的!