2013-12-23 82 views
1

我想從我的私人消息表與一個優雅的SQL查詢對話。這裏是我的表的簡化版本:從查詢中檢索對話的SQL查詢?

Sample table

比方說,我想檢索所有詹姆斯的談話。綠色突出顯示的行是我希望他在他的收件箱中。換句話說,我想選擇詹姆斯收到的最新消息,按發件人分組。我已經試過以下查詢:

SELECT * 
FROM "messages" 
WHERE To = "James" 
ORDER BY Id DESC 
GROUP BY `From` 

但MySQL的返回我這些行:

Sample table

那麼我該如何解決這個要求嗎?

謝謝!

編輯:我不應該使用「From」作爲字段名稱,我現在不會改變它以避免突破答案,但對此感到遺憾。

+4

'SELECT * ... GROUP BY From'停止這樣做。學習如何使用GROUP BY'。 – Kermit

回答

3
SELECT M.Id, 
    M.`From`, 
    M.`To`, 
    M.message 
FROM messages M 
INNER JOIN 
    (SELECT `from`, max(Id) as maxId 
    FROM messages 
    WHERE `to` = "James" 
    GROUP BY `from`)T 
ON M.Id = T.maxId 

你說你想要的消息說「詹姆斯」已收到,但你比較from = 'James'是一個錯誤?

編輯:@Lotharyx想知道如果沒有子查詢有辦法做到這一點,所以這裏是一種方法。看到第二個查詢在此sqlFiddle

SELECT IF(@prevFrom IS NULL OR @prevFrom != M.`From`,@row:=1,@row:[email protected] +1) as row, 
     @prevFrom:=M.`From`, 
     M.id, M.`From`, M.`To`, M.message 
FROM messages M 
WHERE `to` = 'James' 
HAVING row = 1 
ORDER BY M.`From`, M.Id DESC; 
+0

哈,是的,這是一個錯誤,對此感到遺憾。 – superzamp

+0

我犯了一個錯字'M.message'而不是'M.messages' –

+0

顯然'To'也是一個保留字 –

0

您不需要GROUP BY子句,因爲您沒有使用聚合函數。刪除它,你應該得到你想要的結果。其他人提出了一個以自連接和子查詢爲特徵的查詢,這是不必要的複雜。

SELECT * FROM `messages` WHERE `To` = 'James' ORDER BY `Id` DESC LIMIT 5 

這會給你最近5條消息給詹姆斯。根據需要更改LIMIT參數。

請注意,LIMIT是一個特定於mysql的擴展,但是您使用mysql進行了標記,因此我推測這是您正在使用的引擎。

+1

這不會給OP顯示綠色的行。 –

+0

不知何故,我完全錯過了「按發件人分組」這個問題,你說得對,我的回答完全沒用。一種不使用子查詢的方法,但是...我必須找到它! –

+0

如果您發現它,請發表評論並讓我知道!我也很想知道。 –

0

應該是這樣的,而不是

SELECT * FROM messages WHERE `From` = 'James' ORDER BY Id DESC 
0

這個問題是很老,但如果別人也有類似的疑問,這是我的解決方案:

假設詹姆斯的ID爲1(我用的ID但隨時與 「詹姆斯」用戶名,ID等)

SELECT IF(`from` = 1, `to`, `from`) AS `friend_id`, `message`, `created_at` 
FROM `messages` 
WHERE `from` = 1 OR `to` = 1 
GROUP BY friend_id 
ORDER BY `created_at` DESC 

我不知道這是否是最好的SOLU更換1次但它提取正確的信息。訣竅是使用IF來獲取friend_id(它可以在「from」或「to」列