Prueba esto:
seleccione *de mensajes mwhere no existe (seleccione 1de mensajes mmwhere (mm.fromuser =m.fromuser o mm.fromuser =m.touser) AND (mm.touser =m.touser o mm.touser =m.fromuser) y mm.timestamp>
m.timestamp) y m.fromuser ='usuario1' o m.touser ='usuario1';
Probablemente sería mejor, en el futuro, marcar las conversaciones entre dos usuarios como una conversación en particular, entonces cada mensaje pertenece a una conversación y, por lo tanto, es mucho más fácil encontrar conversaciones en las que participa el usuario e información sobre mensajes relacionados con el conversación. De todos modos.
Prueba este en su lugar. Uf.
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;
Es probable que sea superior al not exists
versión, incluso si logro arreglar esa.
este violín realmente funciona