Я хочу выбрать всех пользователей, с которыми у данного пользователя был разговор с отображением последнего сообщения в этом разговоре. Это мой стол: таблица сообщений

Например: если я хочу выбрать беседы user2, запрос должен возвращать только user1 и user3 (поскольку они единственные, у кого есть беседа с user1) и возвращать только последнее сообщение в каждой беседе.

the result should only contain the highlighted rows

Я сделал табличную функцию, из которой собирался выбрать желаемые результаты, это было так:

CREATE function [dbo].[all_pm] ( @u nvarchar(20) )
returns table
as
return
(
select src as [with] from msg where id in
(select id from msg where src=@u or [des]=@u) and src <> @u
union 
select des as [with] from msg where id in
(select id from msg where [des]=@u or src=@u) and [des] <> @u
)
/*
select * from all_pm('user2')
*/

Но он получает только пользователей, у которых был разговор с данным пользователем, а не последнее сообщение в их разговорах. Я понимаю, что в коде я выбрал только src и des , но если выбрать также msg , мне будут показаны все сообщения в этих разговоры .

Надеюсь, вы, ребята, можете мне помочь; Я был бы очень признателен.

0
Enass Hussien 29 Май 2017 в 04:41

2 ответа

Лучший ответ

Вы можете сделать это с помощью row_number() и некоторой дополнительной логики:

select m.*
from (select msg,
             row_number() over (partition by (case when @u = src then des else src end)
                                order by date_time desc
                               ) as seqnum
      from msg
      where @u in (src, des)
     ) m
where seqnum = 1;
0
Gordon Linoff 29 Май 2017 в 01:48

Вы можете использовать ORDER BY create_at DESC в конце и закрыть весь запрос в ().

В следующий раз попробуйте скопировать и вставить код вместо того, чтобы вставить его изображение

0
user7371395user7371395 29 Май 2017 в 01:47