我有一个消息系统,它可以作为消息系统和聊天系统使用,这些系统由一个名为source的字段区分.
我有消息部分正确排序和分组,但是在聊天部分它没有相应地对这些进行分组,请参阅下面的sql:
SELECT * FROM messages WHERE ( senderID = "1" OR receiverID = "1" ) AND source = "1" GROUP BY receiverID,senderID ORDER BY addedDate DESC LIMIT 10
所以我期待的结果是每场比赛只有一场,即每场比赛一场
但是由于某种原因我得到两个.
提前致谢
解决方法
你可能每次聊天都得到两个答案,因为你会让每个人都处于两个位置
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通常期望所有非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和Receiver ID对于该事务的用户(以及您希望从现在的别名“m2”引用中获得的任何其他数据).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。