每次聊天您可能会得到两个答案,因为您会让每个人都担任两个职位
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 较低的始终位于第一位,而 ID 较高的人始终位于第二位,以防止上述错误重复。
另请注意... 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”参考中获得的任何其他数据)。