你可能會得到每個聊天兩個答案,因爲你將有每個人在兩個位置
ChatID Sender Receiver
1 1 2
2 2 1
3 1 2
4 2 1
So, you'll have a record grouped by
Sender/Receiver
1 2 and
2 1
我想你正在尋找的是不同的人在談話,其中以上,應考慮「一對一聊天」的位置無關,他們都在爲了解決這個問題,我會做這樣的事情......
select
PreQuery.*,
m2.Message,
m2.SenderID,
m2.ReceiverID
from
(SELECT
if(m.senderID < m.receiverID, m.senderID, m.receiverID) as Person1,
if(m.senderID < m.receiverID, m.receiverID, m.senderID) as Person2,
max(m.ID) as LastMessageIDPerChat,
max(m.AddedDate) as LastMessageDate
FROM
messages m
WHERE
m.Source = "1"
AND "1" IN (SenderID, ReceiverID)
GROUP BY
Person1,
Person2
ORDER BY
m.AddedDate DESC
LIMIT 10) PreQuery
JOIN Messages m2
on PreQuery.LastMessageIDPerChat = m2.ID
這將確保無論哪個ID是將低ALWA ys位於第一位置,並且無論哪個人的身份證號碼更高,總是處於第二位置以防止上述虛假重複。
另請注意...... GROUP BY通常期望所有非group by字段都與某個聚合關聯,否則,它只會抓取具有合格條件的記錄的第一個實例。所以,如果你想在不同的日子對話一樣的人,你會希望通過這樣它可能需要添加「AddedDate」之類的......
Person1 Person2 on 4/20
Person1 Person3 on 4/20
Person3 Person4 on 4/20
Person1 Person2 on 4/18
Person1 Person5 on 4/17
Person3 Person4 on 4/15
要得到誰發出最後的狀態,我必須爲每個對話包裝配對人的查詢並獲得該對話的最後一個ID。然後,將其重新加回到該ID上的消息(如果ID實際上是消息表的主鍵ID,則根據需要進行調整)。從加入中,我可以獲得對話的最後一條消息以及發件人ID和接收者ID是用於該交易的人(以及您希望從現在的別名「m2」參考獲得的任何其他數據)。
你能提供一些樣本數據嗎? – mellamokb 2012-04-27 12:38:46
您可以提供表格數據 – 2012-04-27 12:49:24
在對行進行分組時,您必須在SELECT語句中指定列。 – 2012-04-27 12:49:31