2014-07-04 36 views
1

我有一個小問題要解決,但我不能。我有以下chat表:MySQL:選擇每一對的最後一行

id  user friend  msg      date 
---------------------------------------------------------------------- 
1  1  2   Hello Bob!    2014-07-04 01:00 
2  1  2   How are you doing?  2014-07-04 01:01 
3  2  1   I'm fine bro!   2014-07-04 02:30 
4  1  3   Hey Mark :D    2014-07-04 02:31 
5  3  1   Yo!      2014-07-04 02:32 
6  4  1   Wassup?!    2014-07-04 07:00 

我正在一個PHP getInbox($uid)方法,返回在每對(用戶和朋友)的最後的消息的陣列。我試着SELECTGROUP BY friend查詢,但它不完整。

SELECT * FROM `chat` 
GROUP BY `friend` 
WHERE `user` = $uid OR `friend` = $uid 

期望的結果是:

id  user friend  msg      date 
---------------------------------------------------------------------- 
3  2  1   I'm fine bro!   2014-07-04 02:30 
5  3  1   Yo!      2014-07-04 02:32 
6  4  1   Wassup?!    2014-07-04 07:00 

我希望幫助!

+0

如果你有某種「線索」或「對話」標識符,這將會容易得多。一個簡單的方法是將所有答覆的「父」設置爲鏈中的第一個,然後選擇每個鏈中的最後一個。 – tadman

+0

所以我猜'4,1,3'是給mark的信息,然後'5,3,1'是mark的回覆? –

+0

我想過了,在每個聊天行上創建一個表'conversations'並設置一個外鍵。但我想用一張桌子來嘗試。 – bodruk

回答

3
SELECT c.* FROM 
chat c 
JOIN 
(SELECT 
    max(id) max_id, 
    (CASE WHEN user < friend THEN user ELSE friend END) user_a, 
    (CASE WHEN user < friend THEN friend ELSE user END) user_b 
FROM chat 
    GROUP BY user_a, user_b) t1 ON t1.max_id = c.id 

case語句按升序排列(用戶,朋友)。例如,(1,2)和(2,1)都將被轉換爲(1,2)。有序的一對唯一標識一個對話。最後,爲每個有序對選擇最新的ID,並從聊天表中顯示具有這些ID的行。

+0

它的工作原理!謝謝。你可以添加一些評論,或者解釋你的邏輯嗎? – bodruk

+1

@drux更新瞭解釋 – FuzzyTree