我有一个消息系统,可以作为消息系统和聊天系统使用,这些系统由一个名为source的字段区分。
我有消息部分正确排序和分组但是在聊天部分它没有相应地对这些进行分组,请参阅下面的SQL:
SELECT *
FROM messages
WHERE ( senderID = "1" OR receiverID = "1" )
AND source = "1"
GROUP BY receiverID, senderID
ORDER BY addedDate DESC LIMIT 10
所以我期待的结果只是每场比赛一次,即每场比赛一次
然而,由于某种原因我得到两个。提前致谢
答案 0 :(得分:2)
每次聊天你可能得到两个答案,因为你会让每个人都处于两个位置
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和接收者ID对于该事务的用户(以及您希望从现在的别名“m2”引用中获得的任何其他数据)。
答案 1 :(得分:1)
你确定你的ID不是整数吗?
SELECT
receiverID,
senderID,
MAX(addedDate) as maxAddedDate
FROM
messages
WHERE
(
senderID = 1
OR receiverID = 1
)
AND source = 1
GROUP BY
receiverID,
senderID
ORDER BY
addedDate DESC
LIMIT 10
答案 2 :(得分:0)
检查一下。
SELECT
receiverID,
senderID,
MAX(addedDate) as maxAddedDate
FROM messages
WHERE ( senderID = 1 OR receiverID = 1) AND source = 1
GROUP BY receiverID, senderID
ORDER BY addedDate DESC
您没有提到按字段分组的任何汇总。
如果您按字段按任意组记录多条记录,那么会发生什么?
你应该有总和,数,......