@gelirgwenn

Как подсчитать количество врачей, работающих в неделю?

Доброго времени суток, есть две таблицы в MySQL:
Первая - список врачей, структура (id, full_name, specialty, status), около 1000 записей.
Вторая - выходные врачей (id, doctor_id, start_date, end_date), около 50 записей-интервалов времени на одного врача (всего около 50000 записей). start_date, end_date - unix timestamp формата.
Нужно подсчитать кол-во врачей, которые работают, т.е. не находятся в отпуске/выходном для заданного интервала времени, например, недели.
Если нужно найти кол-во хирургов для заданного интервала, например inputInterval с границами также в unix timestamp - все просто, запрос вида с использованием в условии проверки на непересечение интервалов работает отлично:
SELECT COUNT(doctors.id) AS total_doctors, doctors.speciality
FROM doctors
WHERE NOT EXISTS (
     SELECT holidays.id
     FROM holidays
     WHERE holidays.doctor_id = doctors.id
     AND holidays.start_date > inputInterval.end_date OR holidays.end_date < inputInterval.start_date
)
GROUP BY doctors.specialty
HAVING doctors.speciality = "хирург"

Но, если ни одного врача не найдено - то нужно предложить несколько других временных промежутков, когда хотя бы 1-2 хирурга работают. Вот тут у меня проблема, подскажите, куда копать, кто сталкивался с таким.
У меня назрел вариант решения, но мне кажется - кривой.
1. Сделать выборку всех хирургов из таблицы докторов
2. Выбрать все выходные, end_date которых больше сегодняшнего дня для хирургов
3. Сформировать массив вида doctor_id => список интервалов выходных
4. Выполнить в цикле слияние всех интервалов, чтобы из интервалов вида 01/02 - 01/03 и 01/02 - 01/04 получился один интервал 01/02 - 01/04, т.е. объединить интервалы, которые входят в другие интервалы.
5. Потом в цикле отсортировать все интервалы по start_date, и вычислить свободные интервалы, типа сложить end_date i-ой записи с start_date i+1 записи.
6. Пройтись циклом по всем свободным интервалам и вычислить, сколько докторов не сходится с данным интервалом, используя выборку из пункта 2.
Может кто знает иное решение? Буду очень благодарен за помощь! Хотя бы идею, реализовывать сам буду
  • Вопрос задан
  • 133 просмотра
Пригласить эксперта
Ответы на вопрос 2
@BorisKorobkov Куратор тега MySQL
Web developer
запрос вида с использованием в условии проверки на непересечение интервалов работает отлично

Значит, плохо тестировали. Этот запрос не работает для отпусков, которые...
- начались до диапазона и заканчиваются после диапазона
- ровно совпадают с диапазоном
- начинаются или заканчиваются внутри диапазона
Ответ написан
SELECT COUNT(doctors.id) AS total_doctors, doctors.speciality
JOIN holidays ON holidays.doctor_id = doctors.id AND (holidays.start_date > inputInterval.end_date OR holidays.end_date < inputInterval.start_date)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы