簡體   English   中英

選擇所有匹配的兩個字段,並使用mysql將這兩個字段分組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM