Имеется 2 таблицы:
cabinets:
- id (PRIMARY KEY)
- name (VARCHAR 64)
... (ещё куча полей для фильтров) ...
busy:
- cabinet_id (не уникальное)
- date_start (DATE)
- date_end (DATE)
Нужно, имея дату начала ($s) и окончания ($e) занятий, выбрать доступные кабинеты.
Приходит в голову что-то вроде..
SELECT c.name
FROM cabinets c
WHERE NOT (
SELECT COUNT(cabinet_id)
FROM busy b
WHERE
b.cabinet_id = c.id AND ( date_start < $e AND date_end > $s )
)
Но, во первых, не работает, да и способ выглядит очень прямолинейно и неоптимально... а записей может быть, например, 3000 в кабинетах и по 10 забронированных интервалов на каждый.
Как это сделать правильно?