2011-02-25 36 views
4

你好,基本上我試圖複製Facebook的郵件系統到我的網站。獲取每個組中的最後一行?

這是邏輯... 「當用戶1創建新消息發送給用戶7時,將創建一個新的線程,thread_id爲1(表:messages_thread),並將新條目插入到表中:messages message_id 1(table:messages)。當user7 REPLYS到user1的消息,message2被創建,並且它的thread_id是1.

現在當用戶1創建一個NEW MESSAGE來發送給user7時,線程2被創建,並且當用戶7回覆thread2時,會創建消息4(希望你能得到邏輯)。

一切都很好。唯一的問題是我需要選擇線程中的最新消息,但是im ha詠麻煩與SQL,

這個SQL,我有作爲現在的...

SELECT max(message_id) message_id, m.thread_id, m.body, m.user_id,m.to_id, m.message_status, m.new, m.date, u.id, u.displayname, u.username, u.profile_img 
FROM messages m INNER JOIN users u ON u.id = m.user_id 
WHERE to_id = 7 AND (message_status = 'unread' or message_status='read' or message_status='saved') 
group by thread_id Order by message_id Desc LIMIT 10 

生成此...

+------------+-----------+----------------------+---------+-------+----------------+-----+------------+----+--------------+----------+-------------+ 
| message_id | thread_id | body     | user_id | to_id | message_status | new | date  | id | displayname | username | profile_img | 
+------------+-----------+----------------------+---------+-------+----------------+-----+------------+----+--------------+----------+-------------+ 
|   6 |   2 | Really nice   |  1 |  7 | read   | 0 | 1298617367 | 1 | Kenny Blake | imkenee | 28_1  | 
|   4 |   1 | Whats good with you? |  1 |  7 | read   | 0 | 1298607438 | 1 | Kenny Blake | imkenee | 28_1  | 
+------------+-----------+----------------------+---------+-------+----------------+-----+------------+----+--------------+----------+-------------+ 

這是好的,但一個小問題,它選擇每組中的第一行,並試圖選擇每個組中的最新(最後一行)

我該怎麼做?這裏是桌子。謝謝!

表:Messages_thread

+----+---------+----------------+-------------+-----------+---------------+-------------+------------+ 
| id | user_id | subject  | from_status | to_status | from_s_delete | to_s_delete | date  | 
+----+---------+----------------+-------------+-----------+---------------+-------------+------------+ 
| 1 |  1 | Hey Kenny  | unread  | unread |    0 |   0 | 1298607438 | 
| 2 |  7 | Check out this | unread  | unread |    0 |   0 | 1298617344 | 
+----+---------+----------------+-------------+-----------+---------------+-------------+------------+ 

表消息

+------------+-----------+---------+-------+-----------------------------------------------------------+----------------+-----------------+-----+------------+ 
| message_id | thread_id | user_id | to_id | body              | message_status | is_sent_deleted | new | date  | 
+------------+-----------+---------+-------+-----------------------------------------------------------+----------------+-----------------+-----+------------+ 
|   1 |   1 |  1 |  7 | Whats good with you?          | read   |    0 | 0 | 1298607438 | 
|   2 |   1 |  7 |  1 | Nothing Kenny just chilling. Whats up with you though???? | read   |    0 | 0 | 1298607473 | 
|   4 |   1 |  1 |  7 | Just posted victor how are you man?      | read   |    0 | 0 | 1298607956 | 
|   5 |   2 |  7 |  1 | Look at this poem....          | read   |    0 | 0 | 1298617344 | 
|   6 |   2 |  1 |  7 | Really nice            | read   |    0 | 0 | 1298617367 | 
|   7 |   2 |  7 |  1 | Yea i know right :)          | unread   |    0 | 0 | 1298617383 | 
+------------+-----------+---------+-------+-----------------------------------------------------------+----------------+-----------------+-----+------------+ 
+0

從結果產生,不會看起來像你的選擇各組的「最後」行?因爲您正在使用帶有DESC命令的SQL,它將爲每個線程選擇最後一行。 – Burhan 2011-02-25 08:18:07

+0

是的,這就是我需要幫助,其安排組,我需要選擇每個組中的最後一行 – Kenny 2011-02-25 08:20:12

+1

+1只是爲了格式化問題 – kevchadders 2011-02-25 08:40:59

回答

2

組在子查詢,這將返回最後的消息爲每個線程的線程:

SELECT m.message_id, m.thread_id, m.body, m.user_id, 
    m.to_id, m.message_status, m.new, m.date, u.id, u.displayname, u.username, u.profile_img 
FROM messages m 
    INNER JOIN users u ON u.id = m.user_id 
    INNER JOIN (
    SELECT MAX(message_id) MaxMsgIDForThread 
    FROM messages 
    WHERE to_id = 7 
     AND (message_status = 'unread' 
     or message_status='read' 
     or message_status='saved') 
    GROUP BY thread_id 
) g ON m.message_id = g.MaxMsgIDForThread 
Order by m.message_id Desc 
LIMIT 10 

WHERE可以需要移動到外部查詢,現在它會選擇最後一條消息符合標準,如果你想在條件不滿足的情況下完全跳過線程,則將其移至外部查詢。

您還應該考慮將消息狀態存儲爲ENUM,這將有助於比較。

+0

注意:'ORDER BY message_id'不需要獲得最後一條消息。保留它,如果你想自己排序的結果。 – 2011-02-25 08:28:55

+0

謝謝soo! – Kenny 2011-02-25 08:46:42

-1

有沒有辦法通過
添加爲組但也許這個作品:

SELECT max(message_id) message_id, MAX(m.thread_id), m.body, m.user_id,m.to_id, m.message_status, m.new, m.date, u.id, u.displayname, u.username, u.profile_img 
FROM messages m INNER JOIN users u ON u.id = m.user_id 
WHERE to_id = 7 AND (message_status = 'unread' or message_status='read' or message_status='saved') 
group by thread_id Order by message_id Desc LIMIT 10 
+0

將不起作用,1)因爲MySql拾取的消息行不會是最後一個,而且'm.thread_id'周圍的'MAX'不會執行任何操作,因爲您正在對它進行分組**。 – 2011-02-25 08:30:01

相關問題