2017-05-29 38 views
0

我想選擇給定用戶進行對話並顯示對話中最新消息的所有用戶。 這是我的表: messages table如何從社交網絡數據庫的消息表中選擇給定用戶的會話?

例如:如果我要選擇user2的對話,查詢必須只返回用戶1和用戶3 (因爲他們是誰,有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 [email protected] or [des][email protected]) and src <> @u 
union 
select des as [with] from msg where id in 
(select id from msg where [des][email protected] or [email protected]) and [des] <> @u 
) 
/* 
select * from all_pm('user2') 
*/ 

但只得到我,聊了一會與用戶給定的用戶,而不是他們對話中的最新消息。據我所知,我只在代碼中選擇了srcdes,但如果選擇msg,它也會顯示我在這些會話中的所有消息。

希望你們能幫助我;我真的很感激。

+0

理由不使用圖像[這裏] (http://meta.stackoverflow.com/a/285557/92546)。 – HABO

回答

0

您可以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

這解決了我的問題,這使我的生活更容易一部分,非常感謝你!你能向我解釋它是如何工作的嗎?如果你不介意的話,當然是 –

+0

@EnassHussien。 。 。 https://docs.microsoft.com/en-us/sql/t-sql/functions/row-number-transact-sql。 –

0

您可以在最後使用ORDER BY created_at DESC並關閉()中的整個查詢。

下一次嘗試複製和粘貼代碼,而不是insterting它的映像