Я думаю, это то, что вы ищете.
;WITH tab (row, ID, Sender, Recipient, Date, Message)
AS (select row_number() over (order by date desc), *
from table
where ([Sender ID] = @id or [Recipient ID] = @id)
and ID <> [Sender ID]
and ID <> [Recipient ID]
and [Sender ID] <> [Recipient ID])
SELECT ID, Sender, Recipient, Date, Message
FROM tab
WHERE row = 1
По сути, вы получаете список всех записей для вашего идентификатора пользователя и присваиваете им номера, упорядоченные по дате. Первый может быть выбран как самый последний.
Ниже полного сценария, который я использовал для воспроизведения.
создать таблицу почты (
ID int,
Отправитель int,
Получатель int,
[Date] DateTime,
MessageText varchar (255))
insert into mails values
(1 , 1 , 2 , '2011-01-01 01:55:00' , 'Test Data'),
(2 , 1 , 2 , '2011-01-01 01:56:00' , 'Test Data 2'),
(3 , 2 , 1 , '2011-01-01 01:59:00' , 'Some more test data'),
(4 , 3 , 1 , '2011-01-02 11:50:00' , 'Test Data 3')
declare @id int
select @id = 1
;WITH tab (row, ID, Sender, Recipient, [Date], Message)
AS (select row_number() over (order by [Date] desc), *
from mails
where ([Sender] = @id or [Recipient] = @id)
and ID <> [Sender]
and ID <> [Recipient]
and [Sender] <> [Recipient])
SELECT ID, Sender, Recipient, [Date], Message
FROM tab
WHERE row = 1
Чтобы получить список сообщений, отсортированных по самым новым, вы можете использовать этот запрос:
select *
from mails
where ([Sender] = @id or [Recipient] = @id)
and ID <> [Sender]
and ID <> [Recipient]
and [Sender] <> [Recipient]
order by [Date] desc