The following query will give you the expected results for user 1:
select m.* from messages m
join (
select auser,withuser,max(datesent) datesent from (
select sentby as auser,sentto as withuser,datesent from messages
union
select sentto as auser,sentby as withuser,datesent from messages
) as ud
group by auser,withuser
) maxud
on (m.datesent=maxud.datesent and maxud.auser in (m.sentBy,m.sentTo))
where auser=1
Needless to say, you can change the condition in the where
clause to get similar results for any user.
However, my approach would be to create a view and later select from it, like so:
create view conversation_stuff as
select m.sentBy,m.sentTo,m.dateSent,m.body,maxud.auser,maxud.withuser
from messages m
join (
select auser,withuser,max(datesent) datesent from (
select sentby as auser,sentto as withuser,datesent from messages
union
select sentto as auser,sentby as withuser,datesent from messages
) as ud
group by auser,withuser
) maxud
on (m.datesent=maxud.datesent and maxud.auser in (m.sentBy,m.sentTo))
select sentBy,sentTo,dateSent,body from conversation_stuff where auser=1;
This could prove useful for other uses too, I guess.
EDIT: Changed user
to auser
everywhere, for sqlserver to stop complaining and to avoid []
s...