2015-02-09 43 views
1

談話的最後一條消息我有一個表叫messages檢索每個地方用戶是participent

| id | from_id | to_id | text 
+----+---------+-------+------------------ 
| 1 | 1  | 2  | from 1 to 2 
| 2 | 2  | 1  | from 2 to 1 
| 3 | 1  | 3  | from 1 to 3 
| 4 | 3  | 1  | from 3 to 1 
| 5 | 2  | 3  | from 2 to 3 
| 6 | 1  | 2  | from 1 to 2 (2) 

,其中用戶是一個什麼會是將檢索每個會話的最後一條消息簡單的查詢參與者(發件人 - from_id或收件人 - to_id)?

結果應該是:

| id | from_id | to_id | text 
+----+---------+-------+------------------ 
| 4 | 3  | 1  | from 3 to 1 
| 6 | 1  | 2  | from 1 to 2 (2) 

這是我已經試過:

SELECT * FROM `messages` 
WHERE `id` IN (
    SELECT MAX(`id`) FROM `messages` 
    WHERE `from_id` = 1 OR `to_id` = 1 
    GROUP BY `from_id`, `to_id` 
) 

它的問題是,在談話中如果用戶一直都發件人和收件人,它將檢索用戶發送的最後一條消息和用戶收到的最後一條消息。

+2

@EmanuilRusev感謝你的編輯,它好多了。請不要覺得我在挑選你。我只是想讓你提出一個問題,讓其他用戶更容易提供幫助,如果你的問題能幫助解決他們的問題,它還可以讓用戶來到網站。 – Taryn 2015-02-09 15:42:55

+0

對不起,我很困惑。你說你應該得到的數據(「結果應該是」)看起來像你說你不希望得到的數據(「用戶發送的最後一個問題和它收到的最後一個問題」)。 – 2015-02-09 15:54:42

+0

@EmanuilRusev最近正在根據什麼專欄 - 'id'?或者你有日期時間? – Taryn 2015-02-09 15:54:43

回答

3

編輯:

SELECT * 
from messages 
where id in 
(
    SELECT max(id) 
    FROM messages 
GROUP BY CASE WHEN from_id > to_id THEN concat(from_id, 'chat', to_id) 
       ELSE concat(to_id, 'chat', from_id) 
     END 
) 
and (from_id = 1 
    or to_id = 1) 

我使用的子查詢來獲取每個聊天的最後一行:

SELECT max(id) 
    FROM messages 
GROUP BY CASE WHEN from_id > to_id THEN concat(from_id, 'chat', to_id) 
       ELSE concat(to_id, 'chat', from_id) 
     END 

您可以檢查我的更新演示中SQLFiddler

+0

我正要提交這樣的內容。 – 2015-02-09 16:28:28

+0

你不需要一個聯盟所有 - 看到這個演示 - http://sqlfiddle.com/#!2/e047d9/8 – Taryn 2015-02-09 16:28:59

+0

它似乎沒有工作的情況下,用戶是最後一個收件人多個對話的消息:http://sqlfiddle.com/#!2/920dc/1 – 2015-02-09 16:41:35