Суть - нужно выбрать все услуги, в которые записан клиент одновременно в определенный промежуток времени.
category - таблица услуг: name - название услуги, sid - идентификатор услуги.
sessions - таблица записей: service_id - идентификатор услуги в ней, start_time - время начала оказания услуги, end_time - время окончания оказания услуги, session_id - идентификатор записи.
client_sessions - таблица связи клиентов и записей. client_id - идентификатор клиента, session_id - идентификатор записи.
SELECT name FROM category WHERE sid IN
(
SELECT DISTINCT service_id FROM sessions WHERE session_id IN
(
SELECT session_id FROM sessions WHERE
(
(
start_time<=(SELECT start_time FROM sessions WHERE session_id='$session_id')
AND end_time>=(SELECT start_time FROM sessions WHERE session_id='$session_id')
)
OR
(
start_time<=(SELECT end_time FROM sessions WHERE session_id='$session_id')
AND end_time>=(SELECT end_time FROM sessions WHERE session_id='$session_id')
)
OR
(
start_time>=(SELECT start_time FROM sessions WHERE session_id='$session_id')
AND end_time<=(SELECT end_time FROM sessions WHERE session_id='$session_id')
)
OR
(
start_time<=(SELECT start_time FROM sessions WHERE session_id='$session_id')
AND end_time>=(SELECT end_time FROM sessions WHERE session_id='$session_id')
)
)
)
AND session_id<>'$session_id'
AND session_id IN
(
SELECT session_id FROM client_sessions WHERE client_id='$client_id'
)
)
Вот такой запрос возвращает какие-то услуги, но не те, какие нужно вернуть, что-то у него с логикой (со скобками) не так….