2017-01-10 154 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

相关问题