Vyzkoušejte toto:
vyberte *ze zpráv mwhere not exists (vyberte 1ze zpráv mmwhere (mm.fromuser =m.fromuser nebo mm.fromuser =m.touser) AND (mm.touser =m.touser nebo mm.touser =m.fromuser) a mm.timestamp>
m.timestamp) a m.fromuser ='user1' nebo m.touser ='user1';
Do budoucna by pravděpodobně bylo lepší označit konverzace mezi dvěma uživateli jako konkrétní konverzaci, pak by každá zpráva patřila do konverzace, a tak je mnohem snazší najít konverzace, kterých se uživatel účastní, a informace o zprávách souvisejících s konverzace. Každopádně.
Zkuste místo toho tento. Fuj.
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;
Je pravděpodobné, že bude lepší než not exists
verzi, i když se mi ji podaří opravit.