Mysql 使用线程和消息构建收件箱查询

Mysql 使用线程和消息构建收件箱查询,mysql,Mysql,因此,我有两个表用于处理消息线程和消息 messages: id | thread | user_from | user_to | text | created threads: id | user_from | user_to | created | status 我想构建一个查询,通过以下方式获取线程: 该线程的最新消息 该线程的id 到目前为止,我一直在处理这个问题,首先获取所有线程(当然有适当的限制),然后分别获取每个线程的最新消息 有什么想法吗 更新: 表关系:消息线程=线程id在

因此,我有两个表用于处理消息
线程
消息

messages:
id | thread | user_from | user_to | text | created

threads:
id | user_from | user_to | created | status
我想构建一个查询,通过以下方式获取线程:

  • 该线程的最新消息
  • 该线程的id
  • 到目前为止,我一直在处理这个问题,首先获取所有线程(当然有适当的限制),然后分别获取每个线程的最新消息

    有什么想法吗

    更新:


    表关系:
    消息
    线程
    =
    线程
    id

    在我的头顶上:

    select t.id, max(m.id) as last_message_id
    from threads t
    left outer join messages m on m.thread = t.id
    group by t.id
    
    SELECT t.id, m.* FROM threads t
    INNER JOIN messages m ON m.thread = t.id
    WHERE m.id = 
       (SELECT id FROM messages WHERE thread = t.id ORDER BY id DESC LIMIT 1);
    

    [编辑]经过测试,它似乎工作正常。

    我想:

    SELECT t.id, m.* FROM threads t
    INNER JOIN messages m ON m.thread = t.id
    WHERE m.id = 
       (SELECT id FROM messages WHERE thread = t.id ORDER BY id DESC LIMIT 1);
    
    [编辑]经过测试,似乎效果良好。

    试试这一款

    SELECT  a.id     AS ThreadID, 
            c.`text` AS LatestMessage
    FROM    threads a 
                INNER JOIN
                (
                    SELECT  thread, max(created) maxCreated
                    FROM    messages
                    GROUP BY thread
                ) b on a.id = b.thread 
                INNER JOIN messages c
                        on a.id = c.thread AND
                           b.maxCreated = c.created
    
    试试这个

    SELECT  a.id     AS ThreadID, 
            c.`text` AS LatestMessage
    FROM    threads a 
                INNER JOIN
                (
                    SELECT  thread, max(created) maxCreated
                    FROM    messages
                    GROUP BY thread
                ) b on a.id = b.thread 
                INNER JOIN messages c
                        on a.id = c.thread AND
                           b.maxCreated = c.created
    

    这两个表有什么关系?@johntotetwo更新了问题。好的,我刚刚在下面发布了我的答案。这两个表有什么关系?@johntotetwo更新了问题。好的,我刚刚在下面发布了我的答案。我假设最新的ID是最新的消息-如果没有,将子查询更改为使用
    created
    字段。您确定子查询上可以访问
    t.id
    吗?确定-或者您永远无法从主查询限制子查询。我假设最新的id是最新的消息-如果不是,将子查询更改为使用
    created
    字段。是否确实可以在子查询上访问
    t.id
    ?确定-或者永远无法从主查询限制子查询。