2013-05-16 172 views
0

我正在製作一個類似facebook的消息系統。消息系統mysql,消息列表

我有兩個表:

messages => 
    m_id (message id) 
    t_id (thread id) 
    author_id (id of user that wrote the message) 
    text (Text for the message) 
    date (date) 
    time (time) 

thread_recipients => 
    t_id (thread_id) 
    user_id (id of the user that will belong to this thread) 
    read (Flag to tell if there are any unread messages) 

所以我基本上要爲獲得線程(對話),一個用戶的部分名單。在該列表中,我想選擇在線程中發佈的最後一條消息的文本,日期和時間。

我已經做了sqlfiddle: http://sqlfiddle.com/#!2/a3d9b/2

所以基本上我想這個查詢只返回最後一排,因爲它具有最高的消息ID。

如果可以在沒有子查詢的情況下完成,那就太棒了。如果沒有,那麼我只好住在一起(:

編輯: 我想出如何使用子查詢做到這一點,但在這裏我最大的擔憂是表現我非常喜歡做的事。 。另一種方式,如果可能的

SELECT r.t_id, m.author_id, left(m.text, 50) 
FROM 
messages m, 
thread_recipients r 
WHERE 
r.user_id = 16 and 
r.t_id = m.t_id and 
m.m_id = (SELECT MAX(mm.m_id) FROM messages mm WHERE mm.t_id = m.t_id) 

回答

0

試試這個

SELECT r.t_id, m.author_id, left(m.text, 50) 
FROM messages m, thread_recipients r 
WHERE 
r.user_id = 16 and r.t_id = m.t_id 
GROUP BY m.m_id 
ORDER BY m.m_id DESC 
LIMIT 1 

我已更新您的sqlfiddle

+0

剛剛嘗試過,並將用戶16添加到線程2並刪除了限制。這返回了全部6條消息。我需要選擇用戶所在的所有線程,但只能從最新的線程獲取文本。但我喜歡這種方法,它可以工作嗎? – jah