2011-02-28 64 views
0

我想創建一個Sql語句,顯示我收到的十個第一個聯繫人以及他們最近發送的消息和時間。表列爲messageId, messageBody, fromUser, toUser, timeStamp,表格爲messages。數據庫是Mysql,Java是語言。但我希望這發生在一個單一的SQL語句。顯示我收到的十個第一個聯繫人消息

回答

0

我解釋「顯示十個第一接觸」,該提交的消息第一10人。

Select M2.fromUser 
    , LastMessage.messageBody 
    , LastMessage.timeStamp 
From (
     Select M1.fromUser 
      , Min(M1.timeStamp) As FirstMessage 
      , Max(M1.messageId) As LastMessageId 
     From messages As M1 
     Where M1.toUser = 'my username' 
     Group By M1.fromUser 
     Order By Min(M1.timeStamp) Asc 
     Limit 10 
     ) As M2 
    Join messages As LastMessage 
     On LastMessage.messageId = M2.LastMessageId 
+0

嗨!我試圖實現你的代碼。但是我不明白你在用FirstMessage做什麼,即使我收到正確的結果? – einstein 2011-02-28 20:33:17

+0

好的,我改變了從最小值到最大值的som變化,而不是讓它更直觀 – einstein 2011-02-28 20:50:19

+0

@ Woho87 - 如果你的意思是偶然使用Min for LastMessageId,是的,這是一個錯字。 – Thomas 2011-02-28 21:14:45

-1
SELECT fromUser, timeStamp, messageBody FROM messages ORDER BY timeStamp LIMIT 10 
+0

這並不檢索每個這些用戶的最新發送的信息和時間。 – 2011-02-28 18:42:42

+0

易於添加這些東西... – 2011-02-28 18:44:17

+0

保持單一查詢並不那麼容易。 – 2011-02-28 18:54:28

0

您可以使用group by來查找每個聯繫人的最新消息。然後,你可以加入回消息表檢索郵件正文:

select LastTen.Contact 
,  LastTen.LastMessageDate 
,  msg.messageBody 
from (
     select fromUser as Contact 
     ,  max(timeStamp) as LastMessageDate 
     from YourTable 
     where toUser = 'YourName' 
     group by 
       fromUser 
     order by 
       max(timeStamp) desc 
     limit 10 
     ) LastTen 
join YourTable msg 
on  msg.fromUser = lastTen.Contact 
     msg.timeStamp = lastTen.LastMessageDate 
+0

我不知道是誰投票給你的,但我認爲這一個顯然是最簡單的一個 – einstein 2011-02-28 19:02:52

+0

我沒有投票贊成,但我明白了原因。它不檢索消息。 – 2011-02-28 19:09:46

+0

你有權利泰德!我是小盲人 – einstein 2011-02-28 19:31:02

0

像這樣的東西可能會奏效:

SELECT fromUser, messageBody, timeStamp 
FROM (SELECT DISTINCT fromUser FROM messages ORDER BY timeStamp LIMIT 10) AS m1 
     LEFT JOIN messages 
     ON(fromUser) 
ORDER BY timeStamp DESC LIMIT 1 
+1

如果提交的前10條消息全部由同一個人發生,會發生什麼? – Thomas 2011-02-28 18:54:54

+0

好點。我修改了我的例子(爲了糾正這個問題,我希望)。 – 2011-02-28 19:04:26

+0

當使用Distinct時,大多數DBMS不喜歡在Order By中使用不在Select子句中的列。 TBH,我不確定它會如何解釋,假設數據庫允許它。 – Thomas 2011-02-28 19:30:04

相關問題