2017-01-10 86 views
0

我試圖從某個線程獲取最後一條消息,但似乎無法獲得我的查詢權。 我似乎沒有從某個線程獲取最後一條消息。MySQL獲取最後一條消息(VarChar)

介紹

我用3個表 - 信息,message_users,message_threads

所有消息都屬於某個線程(有點像論壇和帖子是如何工作的?) 用戶可以添加多個用戶到某個線程,所以多個用戶可以在同一個線程中互相發送消息。

數據庫結構

messages table 
    id | t_id | u_id | message | time 
--------+---------+--------+-----------+-------- 
     1 | 1 | 1 | hello! | timestamp 
     2 | 1 | 2 | hi!  | timestamp 
     3 | 2 | 1 | testing | timestamp 


message_threads 
    id | author | subject 
------+---------+----------- 
    1 | 1 | Subject 1 
    2 | 3 | Subject 2 
    3 | 2 | Subject 3 


message_users 
    id | t_id | u_id | read | nonotice 
------+---------+--------+--------+---------- 
    1 | 1 | 1 | 0 | 0 
    2 | 1 | 2 | 0 | 0 
    3 | 2 | 1 | 1 | 0 

查詢

這是我使用的查詢,它幾乎工程,除了它沒有得到最後的ID,無論最後的消息,任何想法? (是的,我已經看了,並尋找以前的問題就問這個問題,但沒有能夠得到固定的查詢基於莫名其妙的答案)

SELECT 
    m2.message, 
    mt.id AS thread_id, 
    max(m.id) AS message_id, 
    max(m.time) AS time, 
    mt.subject 
FROM message_users AS mu 
LEFT JOIN message_threads AS mt ON mt.id = mu.t_id 
LEFT JOIN message AS m ON m.t_id = mt.id 
INNER JOIN (
    select message as messages_text 
    from message group by t_id 
) AS m2 ON m2.id = m.id 
WHERE mu.u_id = 1 AND mu.read = 0 AND mu.nonotice = 0 
GROUP BY mt.id 
ORDER BY m.id DESC 

回答

1
SELECT 
    m.t_id, 
    m.message, 
    m.id AS max_message_id, 
    m.ts AS max_message_ts, 
    t.subject 
FROM messages AS m 
JOIN message_threads AS t ON m.t_id = t.id 
JOIN (
    SELECT t_id, max(id) max_id FROM messages GROUP BY 1 
) AS m2 ON m.id = m2.max_id 
JOIN message_users AS u ON u.t_id = t.id AND u.u_id = 1 AND u.`read` = 0 AND u.nonotice = 0 

如果上面的SQL變得緩慢,你可以執行下列操作的:

1 - ,其中添加到內聯接SQL來作出這樣的結果較小,這是:

SELECT 
    m.t_id, 
    m.message, 
    m.id AS max_message_id, 
    m.ts AS max_message_ts, 
    m2.subject 
FROM messages AS m 
JOIN (
    SELECT t.id, max(m.id) AS max_id, t.subject 
    FROM messages AS m 
    JOIN message_threads AS t ON m.t_id = t.id 
    JOIN message_users AS u ON u.t_id = t.id 
    AND u.u_id = 1 AND u.`read` = 0 AND u.nonotice = 0 
    GROUP BY 1 
) AS m2 ON m.id = m2.max_id 

2 - 重新設計message_thread添加計算方法爲共lumns:(last_message_id,LAST_UPDATED)等

PS - 儘量避免MySQL的關鍵字作爲列名

enter image description here

+0

謝謝,我會嘗試一下我們的那一刻我回家,我會更新,如果有用。 剛剛更新了額外表格信息的問題。 – user2949138

+0

太棒了,它的工作原理! 與第二個解決方案,因爲第一個結果0.05秒,另一個0.0009,也感謝你的建議,當涉及到名稱約定:) – user2949138

相關問題