[英]SELECT all matching two fields and grouping by those two fields with mysql
我有一個消息系統,它可以作為消息系統和聊天系統使用,這些系統由一個名為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”引用中獲得的任何其他數據)。
你確定你的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
看一下這個。
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
您沒有提到按字段分組的任何聚合。
如果您按字段按任意組記錄多條記錄,那么會發生什么?
你應該有總和,數,...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.