Essayez ceci :
select *from messages mwhere not exists (select 1from messages mmwhere (mm.fromuser =m.fromuser or mm.fromuser =m.touser) AND (mm.touser =m.touser or mm.touser =m.fromuser) et mm.timestamp>
m.timestamp)et m.fromuser ='user1' ou m.touser ='user1';
démo ici .
Il serait probablement préférable, à l'avenir, de marquer les conversations entre deux utilisateurs comme une conversation particulière, puis chaque message appartient à une conversation, et il devient ainsi beaucoup plus facile de trouver des conversations dans lesquelles l'utilisateur est impliqué, et des informations sur les messages liés à la conversation. Quoi qu'il en soit.
Essayez celui-ci à la place. Ugh.
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;
Il est susceptible d'être supérieur au not exists
version, même si j'arrive à corriger celle-là.
ce violon fonctionne réellement