2012-04-27 71 views
4

我有一個消息系統,它作爲消息系統和聊天系統加倍出來,這些系統通過稱爲源的字段進行區分。選擇所有匹配的兩個字段,並用這兩個字段與mysql分組

我有消息部分排序,並在聊天部分然而正確分組它不是分組這些相應的,請參閱下面我的SQL:

SELECT * 
FROM messages 
WHERE (senderID = "1" OR receiverID = "1") 
AND source = "1" 
GROUP BY receiverID, senderID 
ORDER BY addedDate DESC LIMIT 10 

所以我期待的結果是每場比賽只有一個,即每個對話一個

然而,由於某種原因,我得到兩個。

在此先感謝

+1

你能提供一些樣本數據嗎? – mellamokb 2012-04-27 12:38:46

+0

您可以提供表格數據 – 2012-04-27 12:49:24

+0

在對行進行分組時,您必須在SELECT語句中指定列。 – 2012-04-27 12:49:31

回答

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是將低ALWA ys位於第一位置,並且無論哪個人的身份證號碼更高,總是處於第二位置以防止上述虛假重複。

另請注意...... 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」參考獲得的任何其他數據)。

+0

這正是我想要做的,但是看着senderID,發件人ID是什麼大於接收者ID? – 2012-04-27 14:06:31

+0

@AndréFigueira,這就是爲什麼IF()檢查發送者與接收者相比。如果發件人較大,則接收人成爲第一人稱位置,發件人成爲第二人稱位置。 – DRapp 2012-04-27 14:14:28

+0

我看得好,但那麼這意味着較低的ID將永遠是接收器的權利? – 2012-04-27 15:01:28

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 

您還沒有提到任何字段組的聚合。

如果你有多個記錄根據字段的任何組,然後會發生什麼?

你應該有總和,計數,...

+0

好,如果它匹配一個談話,例如用戶ID可以是接收者或發件人,並且可以是發件人或接收者的號碼 – 2012-04-27 13:00:35

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 
+0

這還沒有做 – 2012-04-27 12:58:05

+0

那麼結果是什麼? – 2012-04-27 12:58:47

+0

完全一樣,它們都是整數。 – 2012-04-27 13:01:25

相關問題