Sql-Server
內部消息系統的 SQL 查詢
我正在創建一個內部消息傳遞系統(無 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 顯示。
MessageID
4 是對MessageID
3 (MessageParentID = MessageID) 的回复,因此我希望顯示最新消息,並且由於MessageID
4 的日期更大,因此應該在查詢中顯示。想想 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,因為不需要收件人列表或計數中的任何內容