繁体   English   中英

查询:如何获取每一个用户对话的最新消息?

[英]Query: How to obtain the most recent message per one user conversations?

我有一个非常简单但很重要的对话表(created_by是发送消息的用户的代码)。 然后,我有一个sessions_messages表(sent_by是发送消息的用户的代码,message是我的消息文本,created_at是时间戳)。 最后,我有一个对话表,其中包含user_id(接收消息的用户的代码)和created_by(发送消息的用户的代码)。

我正在尝试实现收件箱的功能,我想显示每个会话的最新消息。 ations_users中的user_id是接收消息的用户和正在查询其收件箱的用户。

我尝试了此查询,但是我不知道如何处理created_at时间戳(在表sessions_messages中),以便获取每个会话的最新消息。

select CM.id, CM.message, CM.created_at, C.id as 'conversation_id' from conversations_users CU 
    join conversations C on CU.conversation_id = C.id join conversations_messages CM on C.id = CM.conversation_id where CU.user_id = 1 and CM.created_at = '2015-03-10 14:18:02'

我必须用一些最新的created_at时间戳替换“ 2015-03-10 14:18:02”,这就是我的问题。

我的表是:

  1. 对话用户:ID,对话ID,用户ID,创建者
  2. 对话:ID,created_by
  3. 对话消息:ID,对话ID,发送者,消息,created_at

谢谢!

SELECT cm.*
FROM conversations_messages cm
JOIN conversations c ON cm.conversation_id = c.id
JOIN conversations_users cu ON cu.conversation_id = c.id
WHERE cu.user_id = 1
AND NOT EXISTS (    SELECT 'a'
                    FROM conversations_messages cm2
                    WHERE cm2.conversation_id = cm.conversation_id
                    AND cm2.created_at > cm.created_at
                    )
GROUP BY c.id

这是一种使用max聚合将表重新连接到自身的方法,并按每次会话进行分组:

select CM.id, CM.message, CM.created_at, C.id as 'conversation_id' 
from conversations_users CU 
    join conversations C on CU.conversation_id = C.id 
    join conversations_messages CM on C.id = CM.conversation_id 
    join (
        select max(created_at) maxcreated_at, conversation_id 
        from conversations
        group by conversation_id 
    ) T on T.maxcreated_at = CM.created_at 
           and T.conversation_id = CM.conversation_id 
where CU.user_id = 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM