繁体   English   中英

具有多种条件的MySQL预留系统

[英]MySQL Reservation System with multiple conditions

我正在编写一个用于跟踪约会的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列)。 我这样做是为了减少未来的连接,但我知道这有点非规范化。 如果这是错误的方式,请随时告诉我,我只是没有找到压倒性的证据,除了知道如果我反正一点,我不会在以后做这些连接。 存在“on update”逻辑,因此如果进行了更改,它将更新约会表中的值。

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

从我读过的内容来看,我需要某种约会“插槽”表,但我不确定如何构建该表,以便我可以将它与现有约会进行比较并找到我的插槽。

我对MySQL有一点了解,我总是面临挑战,但我似乎无法理解我将如何做到这一点。 我已经找到了类似的问题,但似乎没有一个真正涵盖了我正在寻找的定制数量,我无法弄清楚如何调整代码以使其适用于我。 希望有人可以帮助我了解我需要采用这个想法的地方!

预先感谢您的帮助!

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

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

就像亚历克斯上面说的那样,你需要一个“所有可能的插槽”表来左边加入(临时或不是)。

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

然后说找一个医生可用的插槽,类似于:

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

我可以尝试帮助您处理其他更复杂的查询,如果这听起来像是在您正在追踪的内容的正确轨道上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM