【问题标题】:MySQL - Find unused time slots in a scheduleMySQL - 在计划中查找未使用的时间段
【发布时间】:2021-04-01 08:01:38
【问题描述】:

我一直在寻找类似案例的解决方案。我有一个约会应用程序,用户可以根据他们的可用时间段预订医生。我创建了一个时间段表和预订表。 不确定的是,如果医生的时间段被占用特定日期,我如何确保其他用户不会在同一日期选择相同的时间段。

CREATE TABLE `time_slots`  (
    `slot_id` int NOT NULL AUTO_INCREMENT,
    `package_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
    `dr_token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
    `start_time` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
    `end_time` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
    `weekday` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
    `s_time_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
    `status` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
    `created_at` datetime(0) NULL DEFAULT NULL,
    `updated_at` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0),
    PRIMARY KEY (`slot_id`) USING BTREE
)

CREATE TABLE `appointments`  (
    `appointment_id` int NOT NULL AUTO_INCREMENT,
    `patient_token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
    `doctor_token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
    `time_slot` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL,
    `start_time` datetime(0) NULL DEFAULT NULL,
    `end_time` datetime(0) NULL DEFAULT NULL,
    `time_slot_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
    `status` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
    `auth_user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
    `confirmed` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
    `invoice_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
    `created_at` datetime(0) NULL DEFAULT NULL,
    `updated_at` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0),
    PRIMARY KEY (`appointment_id`) USING BTREE
)

【问题讨论】:

  • 为什么约会中的time_slot_id是varchar而time_slots表中是int?
  • 检查该时间段的条目是否已经存在,如果存在则不存储。
  • @Joe Teras 感谢您指出这一点

标签: mysql


【解决方案1】:

您可以在简单的查询中选择空闲时间段,例如:

select * from time_slots s
left join appointments a on s.slot_id = a.time_slot_id
where a.appointment_id is null

并允许用户只选择这些插槽之一。

为了安全起见,您可以在约会表的 time_slot_id 列上添加一个唯一键 - 这样您将无法为同一个时段插入两个约会。

我建议不要使用 datetime 类型,只使用 unsigned int 并保存时间戳。

【讨论】:

  • 感谢您的评论。仅当我将日期添加为确实返回所需结果的条件时,它才能正常工作
【解决方案2】:

看看这个帖子,我想它可能会问和你一样的问题: mysql: how put two columns unique in two tables at once

您还可以通过使用SELECT 语句来检查用户请求的时隙并确保在执行插入之前从该查询返回空结果集来解决此问题

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 2014-10-17
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    相关资源
    最近更新 更多