Sql-Server

內部消息系統的 SQL 查詢

  • January 22, 2016

我正在創建一個內部消息傳遞系統(無 SMTP/POP3),並且正在尋找一種方法來查詢使用者的消息列表。這是我的架構:

Messages

_MessageID (PK) 
_MessageParentID (if a reply this will equal MessageID) 
_Body
_Date
_CreatorID (FK userID of the message creator)

MessageRecipients

_MessageRecipientID (PK)
_MessageID (FK to message)
_SendTo (FK UserID)

簡而言之,我正在做的是為消息創建一對多的關係。一個使用者可以向多個收件人發送消息。但回復是一對一的,短消息爆炸是可能的,但沒有群聊。

我創建了一個 SQL Fiddle 來展示:http ://www.sqlfiddle.com/#!6/6421e3/7

在我現在的查詢中,我很接近。使用者 101 應該有 3 行而不是 4 顯示。MessageID4 是對MessageID3 (MessageParentID = MessageID) 的回复,因此我希望顯示最新消息,並且由於MessageID4 的日期更大,因此應該在查詢中顯示。想想 FB 消息是如何工作的,您會看到對執行緒的最新回复 - 而不是單獨的發件箱。

例如預期輸出:

3行

消息 ID 1、2、4

任何幫助都會很棒。

為什麼不使用這個查詢(sqlfiddle):

SELECT [MessageID]
   , [Body]
   , [Date]
   , [MessageParentID] 
FROM Messages 
WHERE MessageID NOT IN (
       SELECT MessageParentID FROM Messages
   )

基本上,如果 MessageID 也是 MessageParentID 則意味著至少有 1 個回复。因此它只查找沒有回复的消息(即沒有 MessageParentID)。

使用這個有限的樣本,它給出了正確的輸出:

MessageID   Body                            Date                        MessageParentID
1           Its getting hot in hure         December, 27 2015 00:00:00  0 
2           Where is all the chicken?       December, 28 2015 00:00:00  0 
4           Sometimes its a little hotter   January, 05 2016 00:00:00   3 

我不明白為什麼:

  • 您是否對 SELECT 中的所有列使用 GROUP BY。你需要一個 DISTINCT 嗎?
  • 您是否使用 Max(M.Date) 無論如何,它也包含在組中
  • 您正在加入 MessageRecipients,因為不需要收件人列表或計數中的任何內容

引用自:https://dba.stackexchange.com/questions/126763