2013-05-10 49 views
1

我試圖重建一個現有的消息系統,使其看起來類似於Twitter的DM服務。目前,我只顯示未讀郵件到我的用戶,但我想顯示在一個單一的「線」 2個用戶之間發送這樣的消息:查詢在「線程」視圖中獲取最近的消息

enter image description here

這裏是我當前的數據庫結構和一些樣本數據: http://sqlfiddle.com/#!2/574e3/1/0

我試着建立查詢一步一步的分解,但我很困惑。 這是我所採取的步驟的列表:

1.獲取之間的「對話」的兩個用戶

SELECT * FROM uc_user_messages 
WHERE uc_user_messages.user_id_1 = 1 OR uc_user_messages.user_id_2 = 1 

2顯示的最後一條消息之間發送的郵件列表兩個用戶

SELECT * FROM uc_user_messages 
WHERE uc_user_messages.user_id_1 = 1 OR uc_user_messages.user_id_2 = 1 
ORDER BY timestamp DESC 

3組談話由USER_ID(顯然這將是一個用戶的名字和一幫在加入機生產線應用程序)。

SELECT * FROM uc_user_messages 
WHERE uc_user_messages.user_id_1 = 1 OR uc_user_messages.user_id_2 = 1 
GROUP BY uc_user_messages.user_id_1 AND uc_user_messages.user_id_2 
ORDER BY timestamp DESC 

而這正是我卡住了...問題是,在兩個用戶之間的對話發送的第一條消息將顯示,而不是最新的消息:http://sqlfiddle.com/#!2/942fb/2

什麼我能做些什麼嗎?希望我不必做任何重大的數據庫設計更改。任何幫助是極大的讚賞。

乾杯,

喬爾

回答

5
SELECT * 
FROM uc_user_messages 
WHERE (LEAST(user_id_1, user_id_2),GREATEST(user_id_1, user_id_2),TIMESTAMP) 
     IN 
     (
      SELECT LEAST(user_id_1, user_id_2) AS x, 
        GREATEST(user_id_1, user_id_2) AS y, 
        max(TIMESTAMP) AS msg_time 
      FROM uc_user_messages 
      GROUP BY x, y 
     ); 

輸出

╔════╦═══════════╦═══════════╦═════════════════╦════════════╦══════╗ 
║ ID ║ USER_ID_1 ║ USER_ID_2 ║  MESSAGE  ║ TIMESTAMP ║ READ ║ 
╠════╬═══════════╬═══════════╬═════════════════╬════════════╬══════╣ 
║ 3 ║   1 ║   2 ║ third message ║ 1366577336 ║ 1 ║ 
║ 4 ║   2 ║   0 ║ a message reply ║ 1366577346 ║ 1 ║ 
╚════╩═══════════╩═══════════╩═════════════════╩════════════╩══════╝ 
+0

我可能誤解了這個問題,但OP似乎對涉及user_id號碼1的消息感興趣。那麼最後一條消息(「消息答覆」)如何相關? – 2013-05-10 17:12:53

+0

@JamesHolderness你不會誤解它。這只是我沒有額外的條件來篩選特定的'User_ID'。上面的查詢將顯示多個用戶的所有對話的最新消息。一個簡單的'AND 1 IN(USER_ID_1,USER_ID_2)'將只給出包含'user_id = 1'的對話結果[這是一個DEMO](http://sqlfiddle.com/#!2/942fb/24) – 2013-05-10 17:15:11

+0

OK,I想想我現在正在做什麼。我只是一個白癡。 – 2013-05-10 17:17:42

1

假設我已經正確理解你,喲我正在尋找用戶1和用戶2之間的最近消息,那麼這是一種方法。

SELECT * FROM uc_user_messages 
WHERE id = (
    SELECT MAX(id) FROM uc_user_messages 
    WHERE uc_user_messages.user_id_1 = 1 OR uc_user_messages.user_id_2 = 1 
) 

這依賴於id是上升的,雖然,這可能不是一個好主意。另一種方法是使用timestamp,但只有在確保這些用戶唯一的情況下才有效。

+0

感謝您的回答,但其他回覆似乎更適合我的需求,因爲我需要獲取用戶之間的所有消息列表,而不僅僅是2個單一用戶。 – 2013-05-10 19:23:25

+0

沒問題。我同意其他答案好得多。 – 2013-05-10 19:33:52