Sql server SQL-从社交网络数据库的messages表中选择给定用户的对话?

Sql server SQL-从社交网络数据库的messages表中选择给定用户的对话?,sql-server,database,tsql,relational-database,Sql Server,Database,Tsql,Relational Database,我想选择所有用户给定用户与显示该对话中最新消息的用户进行对话。 这是我的桌子: 例如:如果我想选择user2对话,查询必须只返回user1和user3,因为他们是唯一与user1对话的人,并且只返回每个对话中的最后一条消息 我制作了一个表值函数,我打算从中选择所需的结果,如下所示: CREATE function [dbo].[all_pm] ( @u nvarchar(20) ) returns table as return ( select src as [with] from msg

我想选择所有用户给定用户与显示该对话中最新消息的用户进行对话。 这是我的桌子:

例如:如果我想选择user2对话,查询必须只返回user1和user3,因为他们是唯一与user1对话的人,并且只返回每个对话中的最后一条消息

我制作了一个表值函数,我打算从中选择所需的结果,如下所示:

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,它会显示这些对话中的所有消息


希望你们能帮助我;非常感谢。

您可以使用ORDER BY created\u at DESC作为结尾,并在中关闭整个查询

下次尝试复制和粘贴代码而不是插入代码的图像时,您可以使用行号和一些附加逻辑执行此操作:

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;

不使用图像的原因是。这解决了我的一部分问题,使我的生活更轻松,非常感谢!你能给我解释一下它到底是怎么工作的吗?如果你不介意的话,当然可以course@EnassHussien . . . .