Experimente isto:
demonstração aqui .
Provavelmente seria melhor, daqui para frente, sinalizar conversas entre dois usuários como uma conversa específica, então cada mensagem pertence a uma conversa e, assim, fica muito mais fácil encontrar conversas em que o usuário está envolvido e informações sobre mensagens relacionadas ao conversação. De qualquer forma.
Tente este em vez disso. Eca.
select m.*
from messages m
left join messages m2
on ((m.fromuser = m2.fromuser and m.touser = m2.touser)
or (m.fromuser = m2.touser and m.touser = m2.fromuser))
and m.timestamp < m2.timestamp
where (m.fromuser = 'user1' or m.touser = 'user1')
and m2.id is null;
É provável que seja superior ao
not exists
versão, mesmo que eu consiga consertar essa. este violino realmente funciona