Учитывая следующие таблицы:
ресурсы
| id | name |
| 1 | John |
| 2 | Anna |
бронирования
| id | start | end | resource_id |
| 1 | 2020-05-29 08:00:00 |2020-05-29 12:00:00 | 1 |
Я хочу найти все ресурсы, доступные для n периодов даты. Я могу создать динамический c запрос, используя следующий подзапрос:
SELECT name, (
SELECT COUNT(id) FROM bookings WHERE
resources.id = bookings.resource_id
AND '2020-05-29 08:00:00' < `end`
AND '2020-05-29 09:00:00' > `start`
) AS 'dp1',
(SELECT COUNT(id) FROM bookings WHERE
resources.id = bookings.resource_id
AND '2020-05-29 09:00:00' < `end`
AND '2020-05-29 10:00:00' > `start`
) AS 'dp2'
FROM resources
, который дает мне следующий результат:
| name | dp1 | dp2 |
| John | 1 | 1 |
| Anna | 0 | 0 |
Это не очень хорошо масштабируется. Если я хочу определить доступность на целую неделю, с 08-17, это будет 70 подзапросов с текущим решением.
Как я могу определить доступность ресурсов для большей n заданной даты периоды элегантнее и эффективнее?