Mysql 我如何显示哪位医生现在有空?

Mysql 我如何显示哪位医生现在有空?,mysql,sql,database-design,Mysql,Sql,Database Design,我正在编写一个医生搜索应用程序,用户可以在其他选项旁边搜索当前可用的医生。表中有几列,其中一列是openinghours type:text,我将每行的总营业时间存储在一个条目中,如下所示: Mo. 08:00-13:00 14:00-18:00 Tu. 14:00-20:00 We. 08:00-13:00 14:00-18:00 Th. 07:00-14:00 Fr. 08:00-13:00 14:00-18:00 Sa. No Su. No 以这种方式将数据存储在openin

我正在编写一个医生搜索应用程序,用户可以在其他选项旁边搜索当前可用的医生。表中有几列,其中一列是openinghours type:text,我将每行的总营业时间存储在一个条目中,如下所示:

Mo.
08:00-13:00
14:00-18:00

Tu.
14:00-20:00

We.
08:00-13:00
14:00-18:00

Th.
07:00-14:00

Fr.
08:00-13:00
14:00-18:00

Sa.
No

Su.
No
以这种方式将数据存储在openinghours列中的一个优点是,这就是我将如何准确地向用户显示数据。在另一列doctoravailable type boolean:yes/no中,我想显示医生现在是否可用。是否可以在MYSQL中编写一个函数,通过始终检查列openinghours来自动更新列doctoravailable?我怎样才能做到呢?有没有其他更好的方法来实现这个目标

我的计划: 我考虑创建一个视图,其中column doctoravailable将作为openinghours的函数。但我不确定这是正确的方法还是有更好的方法可用。

将openinghours存储为单个文本列不是一个好主意,因为它需要在查询中进行字符串操作和类型转换,以计算医生是否可用,这将阻止DBMS有效地索引打开和关闭时间。查询筛选开放时间和关闭时间之间的时间,例如获取所有可用医生的速度将低于必要的速度

相反,将开始和结束时间存储为两个独立的时间列。然后,您的应用程序代码可以格式化该信息以显示给用户


doctoravailable视图是一个好主意,它是免维护的。必须每分钟运行一次查询以更新每个医生的状态听起来很麻烦。

您可以尝试类似的方法。问题是如何更新表。您可以使用cron作业在指定时间更新表。一个选项是在用户进行搜索时更新表

mysql> desc doctors;
+-----------+------------+------+-----+---------+-------+
| Field     | Type       | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+-------+
| weekdays  | tinyint(4) | YES  |     | NULL    |       |
| start     | time       | YES  |     | NULL    |       |
| end       | time       | YES  |     | NULL    |       |
| available | char(1)    | YES  |     | NULL    |       |
+-----------+------------+------+-----+---------+-------+

mysql> select * from doctors;
+----------+----------+----------+-----------+
| weekdays | start    | end      | available |
+----------+----------+----------+-----------+
|        1 | 08:00:00 | 13:00:00 | n         |
|        1 | 14:00:00 | 18:00:00 | n         |
|        2 | 14:00:00 | 20:00:00 | n         |
|        3 | 08:00:00 | 13:00:00 | n         |
|        3 | 14:00:00 | 18:00:00 | n         |
|        4 | 07:00:00 | 14:00:00 | n         |
|        5 | 08:00:00 | 13:00:00 | n         |
|        5 | 14:00:00 | 18:00:00 | n         |
+----------+----------+----------+-----------+

mysql> update doctors set available='y' where weekdays = weekday(now()) and start < time(now()) and end > time(now());

mysql> update doctors set available='n' where not (weekdays = weekday(now()) and start < time(now()) and end > time(now()));

有没有理由不加解释就投反对票?谢谢你的回答。我将基于它创建解决方案。这很有帮助。当然,真正的表还有其他列,其中一列是医生姓名,您需要为每个医生复制每个时间段中的行。这是一个非常好的解决方案。非常感谢你的努力。我选择你的答案作为最佳答案。