3

我正在编写一个用于跟踪约会的 PHP/MySQL 应用程序,并且我坚持根据是否选择了任意数量的条件来定位下一个可用的约会。

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,
`apptDate` date NOT NULL,
`apptTime` time NOT NULL,
`apptLength` int(4) NOT NULL,
`apptStatus` varchar(25) NOT NULL,
`physician` int(9) unsigned NOT NULL,
`apptType` varchar(30) NOT NULL,
`apptInvoice` varchar(10) NOT NULL,
`apptNotes` varchar(1000) NOT NULL,
`apptLocation` varchar(25) NOT NULL,
`apptReminder` int(4) 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 ;

旁注:您会注意到我的类型、位置、状态字段是 varchar,并且它们链接到查找表。因此,我存储的是实际值,而不是每个项目的 ID(因此每个查找表只是作为 PK 的字段值,没有 ID 列)。我这样做是为了减少将来的连接,但我知道这有点非规范化。如果这是错误的方法,请随时告诉我,我只是没有找到压倒性的证据一种或另一种方式,除了知道如果我有点反规范化以后我不必做这些连接。存在“更新”逻辑,因此如果进行更改,它将更新约会表中的值。

这里的目标是显示所有可用的预约时段(这些是 15 分钟的时段,例如上午 12:00-12:14:59、上午 12:15:00-12:29:59 等)。默认情况下,我只会显示接下来 X 天(可能是 14 天)的所有预约空档,没有任何限制。但是,如果患者想看特定的医生,我想限制在此范围内,或者如果医生只需要咨询,我可以将位置限制在咨询室而不占用检查室。或者,我们知道需要安排 X 个月的后续行动,所以我可以在该时间过去后的几天内开始展示。或者,患者只能在周末或下午 5 点之后进行预约。

根据我的阅读,我需要某种约会“空档”表,但我不确定如何构建该表,以便将其与现有约会进行比较并找到我的空档。

我对 MySQL 有一定的了解,而且我总是在迎接挑战,但我似乎无法理解我将如何做到这一点。我一直在寻找类似的问题,但似乎没有一个真正涵盖我正在寻找的定制量,而且我无法弄清楚如何调整该代码以使其适合我。希望有人可以帮助我了解我需要用这个想法去哪里!

预先感谢您的帮助!

4

1 回答 1

0

我不认为计划未来的“减少连接”是一个很好的理由。您应该更担心使用“更新逻辑”(为您或其他人)创建的未来头痛。就像您说的那样,类型、位置和状态等字段可能具有与您的插槽查询相关的元数据(类型“需要 X 个月内跟进”,位置“是考试室”),因此无论如何您最终都需要加入. 即使只是为了找到某个时间段的可用位置,如果我理解正确的话,你肯定需要加入。

我猜一个“插槽”就像一个 5 分钟的时间跨度?例如。12:00-12:04:59、12:05-12:09:59 等?

就像 Alex 上面所说的那样,您需要一个“所有可能的插槽”表来左连接(临时或非临时)。

我可能会在磁盘上永久创建它,因为它被引用了很多。这听起来很浪费,但另一种选择是每次动态生成它,这也不是很好。

然后说找到医生可用的插槽,例如:

SELECT a.* 
FROM slots AS a
LEFT JOIN appointments AS b
ON a.startDate BETWEEN b.apptDate AND DATE_ADD(b.apptDate,INTERVAL b.apptTime MINUTE)
AND b.physician=1234 
WHERE b.appointment IS NULL

如果这听起来像是在您所追求的正确轨道上,我可以尝试帮助您解决其他更复杂的问题。

于 2012-10-08T18:32:45.593 回答