Spróbujmy czegoś innego. Sugeruję to tylko jako "odpowiedź" ze względu na jej długość i nie można sformatować komentarza. Podejdźmy do zapytania modułowo jako serii podzbiorów, które muszą się przeciąć. Zobaczmy, ile czasu zajmie wykonanie każdego z nich (proszę zgłosić). Zastąp swoje znaczniki czasu dla t1 i t2. Zwróć uwagę, jak każde zapytanie bazuje na poprzednim, co sprawia, że poprzednie jest „widokiem wbudowanym”.
EDYCJA:również proszę potwierdzić kolumny w tabeli Sieci.
1
select PM.receiver_id from private_messages PM
where PM.create_at between (t1 and t2)
2
select U.id, U.network_id from users U
join
(
select PM.receiver_id from private_messages PM
where PM.create_at between (t1 and t2)
) as FOO
on U.id = FOO.receiver_id
3
select N.* from networks N
join
(
select U.id, U.network_id from users U
join
(
select PM.receiver_id from private_messages PM
where PM.create_at between (t1 and t2)
) as FOO
on U.id = FOO.receiver_id
) as BAR
on N.id = BAR.network_id