Большое количество вложенных запросов.

Armageddance

Новичок
Помогите разобраться со сложным запросом с большим количеством подзапросов.
Суть - нужно выбрать все услуги, в которые записан клиент одновременно в определенный промежуток времени.

category - таблица услуг: name - название услуги, sid - идентификатор услуги.
sessions - таблица записей: service_id - идентификатор услуги в ней, start_time - время начала оказания услуги, end_time - время окончания оказания услуги, session_id - идентификатор записи.
client_sessions - таблица связи клиентов и записей. client_id - идентификатор клиента, session_id - идентификатор записи.
Сам запрос, который составил:

PHP:
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')))";
сейчас он возвращает 0 строк при записанном одновременно на разные услуги в пересекающееся время клиенте.
 

Armageddance

Новичок
Расположил запрос вот в таком виде. Подскажите, в третьей строчке session_id получают значенния из IN во всех трех случаях? Можно использовать несколько идущих подряд AND и IN?

PHP:
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'
                     )

                )
 

prolis

Новичок
изучай
Код:
select s1.service_id, s2.service_id 
from session s1, session s2, client_sessions cs1,client_sessions cs2
where s1.start_time<=s2.end_time and s1.end_time>=s2.start_time
and cs1.session_id=s1.session_id and cs2.session_id=s2.session_id
and cs1.client_id=cs2.client_id
and cs1.client_id=#CLIENT_ID
 
Сверху