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'
规则
- 如果用户预约日期:04-11-2015 开始时间:09:00:00 和结束时间 10:00:00 其他用户无法在该时间和日期预约。
- 无法预约日期:04-11-2015 开始时间:08:30:00 和结束时间 09:30:00
- 无法预约日期:04-11-2015 开始时间:09:30:00 和结束时间 10:30:00
- 无法预约日期:04-11-2015 开始时间:08:00:00 和结束时间 11:00:00
- 无法预约日期: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 预约时间来延长更多时间,但根据单个治疗师在给定日期内的预约次数,这可能会过大。
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'
规则
- 如果用户预约日期:04-11-2015 开始时间:09:00:00 和结束时间 10:00:00 其他用户无法在该时间和日期预约。
- 无法预约日期:04-11-2015 开始时间:08:30:00 和结束时间 09:30:00
- 无法预约日期:04-11-2015 开始时间:09:30:00 和结束时间 10:30:00
- 无法预约日期:04-11-2015 开始时间:08:00:00 和结束时间 11:00:00
- 无法预约日期: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 预约时间来延长更多时间,但根据单个治疗师在给定日期内的预约次数,这可能会过大。