Php 多条件MySQL预约系统

Php 多条件MySQL预约系统,php,mysql,Php,Mysql,我正在编写一个用于跟踪约会的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

我正在编写一个用于跟踪约会的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:00am-12:14:59am、12:15:00am-12:29:59am等等)。默认情况下,我只显示接下来X天(可能是14天)的所有约会时间,没有任何限制。但是,如果患者想看某个特定的医生,我希望仅限于此,或者如果医生只需要咨询,我可以将地点限制在咨询室,而不占用检查室。或者,我们知道需要安排X个月的随访,这样我就可以在该时间过后的几天内开始显示。或者,患者只能在周末或下午5点之后预约

据我所知,我需要某种约会“时间”表,但我不确定如何构建该表,以便与现有约会进行比较并找到我的时间

我对MySQL有相当的了解,并且我一直都在接受挑战,但我似乎不知道该怎么做。我也曾寻找过类似的问题,但似乎没有一个真正涵盖了我正在寻找的定制量,我也不知道如何调整代码使其适合我。希望有人能帮助我理解我需要在哪里实现这个想法


提前感谢您的帮助

我不认为为未来的“减少加入”做计划是一个很好的理由。你应该更担心你正在用“更新逻辑”制造(为你或其他人)的未来头痛。正如您所说,类型、位置和状态等字段可能包含与插槽查询相关的元数据(类型“需要在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

如果这听起来与您的目标相符,我可以尝试帮助您处理其他更复杂的查询。

编写一个存储过程,动态生成一个临时插槽表,将现有约会与该表匹配,并根据您的附加条件进行筛选。展示完后,放下临时桌子。是的,有15分钟的时间。我已经更新了原来的问题。我喜欢你关于为什么我不应该去规范化的推理。对于其他元数据,我还没有想到会有那么多,谢谢你的评论。至于老虎机表,该表需要多大?从您的查询来看,它似乎必须是每天的每个插槽。把桌子分成几年,这样它们就不是怪物了,这有意义吗?再次感谢您的评论!是的,它应该是每一个可能的插槽,可以保留。我会根据需要在时间表上不断添加(例如,在未来3年内每天添加任何缺少的插槽)。它看起来很大,但它是PS:你关于“减少连接”和将表分成几年的评论告诉我你不信任MySQL来完成它的工作。你真的应该更加信任它,保持表设计的简单,并且相信如果/当性能问题出现时,你会有很多选择。PPS:刚刚注意到我在示例查询中颠倒了表,我对其进行了编辑:)gllen,我最近有点偏离了这一点,但我现在又回到了代码中,我想让你接受你的建议,在一些问题上提供额外的帮助。继续讨论的最佳方式是什么?我的联系人信息在我的个人资料中。谢谢