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 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 有一定的了解,而且我总是乐于接受挑战,但我似乎无法确定我将如何做到这一点。我已经寻找过类似的问题,但似乎没有一个真正涵盖我正在寻找的定制量,而且我无法弄清楚如何调整该代码以使其适合我。希望有人能帮助我理解我需要将这个想法带到哪里去!

预先感谢您的帮助!

最佳答案

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

如果这听起来符合您的要求,我可以尝试帮助您解决其他更复杂的问题。

关于php - 具有多个条件的MySQL预订系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12786035/

相关文章:

php - 在 Windows 上使用 XAMPP 安装 PHP YAML 扩展

php - 设置 google adwords 测试帐户

java - 保存我的对象时出现 Hibernate 异常

php - 多选框只显示最后选择的值

php - 使用变量从命令行运行 php 脚本

mysql 仅在值不存在时插入行

mysql - 如何重构这个 MySQL 查询(2 个表)?

mysql - 以 .sql 格式将数据转储到文件

python manager.py sqlall 我的应用程序无法识别我的应用程序

php - 如何处理Facebook实时更新callback.php页面中的$updates数组