MySQL 查询会给我所有满足下面提到的规则的预约行

MySQL query which would give me all rows for appointment booking those fulfil rules mentioned below

CREATE TABLE IF NOT EXISTS `appointment` (
  `appointment_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `age` int(11) NOT NULL,
  `email` varchar(100) NOT NULL,
  `appointment_date` date NOT NULL,
  `appointment_time` time NOT NULL,
  `appointment_endtime` time NOT NULL,
  `user_id` bigint(20) NOT NULL,
  `therapist_id` bigint(20) NOT NULL,
  `status` char(20) NOT NULL DEFAULT 'SEND' COMMENT 's=send a=accept d=decline r=reschudle',
  `is_doctor_reschedule` int(11) NOT NULL,
  PRIMARY KEY (`appointment_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

我正在写类似

的查询
SELECT therapist_id
     , appointment_time
     , appointment_endtime 
  FROM appointment 
 WHERE   (appointment_time BETWEEN '".$timee."' AND '".$end_time."' 
       OR appointment_endtime BETWEEN '".$timee."' AND '".$end_time."')
   AND therapist_id = '".$_REQUEST['therapist_id']."' 
   AND appointment_date = '".$_REQUEST['date']."' 
   AND status = 'ACCEPTED'

规则

  1. 如果用户预约日期:04-11-2015 开始时间:09:00:00 和结束时间 10:00:00 其他用户无法在该时间和日期预约。
  2. 无法预约日期:04-11-2015 开始时间:08:30:00 和结束时间 09:30:00
  3. 无法预约日期:04-11-2015 开始时间:09:30:00 和结束时间 10:30:00
  4. 无法预约日期:04-11-2015 开始时间:08:00:00 和结束时间 11:00:00
  5. 无法预约日期:04-11-2015 开始时间:09:20:00 和结束时间 09:40:00

在不使用 php 变量引用的情况下,这应该可以防止重叠。看来您正在尝试接受特定时间和治疗师的网络请求,并查询是否可以。不要在您尝试添加的时间之间查找现有约会时间,而是查找您尝试添加的时间是否与现有记录冲突。

(   webStartTimeVar between appointment_time and appointment_endtime 
 OR webEndTimeVar between appointment_time and appointment_endtime )

如果从结果中得到一条记录,说明存在冲突。这限定了开始或结束时间,或者整个约会在另一个之内。比如一个人有一个 1 小时的约会,从早上 8 点到 9 点,一个新条目正在尝试 8:20am - 8:40am,这完全在另一个人之内。 web-time8:20和8-9期有冲突,你有记录,你有冲突。不允许添加约会。

现在,离群值……反过来。如果现有约会是从 8:20-8:40,而新约会是从早上 8 点到 9 点。那么你需要一个外缘测试

(   webStartTimeVar <= appointment_time AND webEndTimeVar >= appointment_endtime )

所以您最完整的查询应该是。

(   webStartTimeVar between appointment_time and appointment_endtime 
 OR webEndTimeVar between appointment_time and appointment_endtime )
 OR ( webStartTimeVar <= appointment_time AND webEndTimeVar >= appointment_endtime )
)

我还会有一个复合索引来帮助优化您在

上的查询

( 状态, appointment_date, therapist_id )

并且对于覆盖索引,您可以通过添加 start/end 预约时间来延长更多时间,但根据单个治疗师在给定日期内的预约次数,这可能会过大。