MySQL запрос, который дал бы мне все строки для назначения встречи, которые выполняют правила, упомянутые ниже

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

-2

Решение

Без использования ссылок на переменные php это должно работать для вас, чтобы предотвратить наложения. Похоже, вы пытаетесь принять веб-запрос определенного времени и терапевта и запрашивает, если он в порядке или нет. Не ищите существующее время встречи между моментами, когда вы пытаетесь добавить, но ищите время, которое вы пытаетесь добавить, чтобы конфликтовать с существующей записью.

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

Если вы получите отчет о результатах, возникнет конфликт. Это определяет время начала или окончания внутри ИЛИ все назначение внутри другого. Например, у одного человека назначена 1-часовая встреча, скажем, с 8:00 до 9:00, и новая запись пробуется на 8:20 утра — 8:40 утра, что полностью внутри другого. веб-время 8: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 )
)

Я также хотел бы иметь составной индекс, чтобы помочь оптимизировать ваш запрос на

(статус, назначение_дата, терапевт_ид)

а для покрывающего индекса вы можете расширить еще больше, добавив время начала / окончания встречи, но это может быть излишним в зависимости от количества встреч, которые будут в данный день для одного терапевта.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector