【问题标题】:How to get last message from each conversation如何从每个对话中获取最后一条消息
【发布时间】:2021-08-21 19:35:11
【问题描述】:

我想显示一个用户的朋友最近的消息列表;就像Messenger和Whatsapp一样。

为此我有 2 个表:用户表和聊天表

用户表

***user_id*** ***username*** ***photo*** ***status***

1                brada         a.png        offline

2                john          b.png        online

3                doe           c.png        offline


***chat table***

***id*** ***user_id*** ***friend_id*** ***message*** ***message_token*** ***msg_time***

1              2             1            hello              ababa           2013-08-21 03:24:00

2              1              2            hi                ababa            2013-08-21 03:24:00

3              1              3           hi man!             baba             2013-08-21 03:24:00

4              3              1           im good             baba             2013-08-21 03:24:00

我希望 brada 的输出是这样的: friend_id 用户名 消息 照片 状态

 2              john             hi          b.png        online

 3              doe              i'm good    c.png        offline

***我发现很难加入这两个表。我的代码只选择最后一条消息:***

SELECT * FROM chat WHERE id in (SELECT max(id) FROM chat WHERE (user_id ='1 OR friend_id =1) GROUP BY message_token )

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    也许是这个?

    SELECT c.chatid,
           u.USER_ID,
           u.username,
           f.USER_ID AS friend_id,
           f.username AS friend_name,
           c.meassage,
           c.msg_time
    FROM chat c
    
    inner join
    (
                SELECT user_id,
                       friend_id,
                       MAX(msg_time) AS maxtime
                FROM chat
                GROUP BY user_id,
                         friend_id
            ) c2
                ON c2.user_id = c.user_id
                   AND c.friend_id = c2.friend_id
                   AND c.msg_time = c2.maxtime
        INNER JOIN users u
            ON c.user_id = u.USER_ID
        INNER JOIN users f
            ON f.USER_ID = c.friend_id
    WHERE u.user_id = 1 --filtered for brada
    

    【讨论】:

    • 它只选择发件人的最后一条消息;在这种情况下布拉达。
    • 如果您也想要 Brada 是friend_id 的消息?您是否有一个具有不同 msg_times 的示例以及您期望的输出。为什么你的预期结果是 2 和 3 而不是 1 和 3?
    • 让我澄清一下:无论发送者是接收者还是布拉达本人,我都希望布拉达获得对话的最后一条消息。例如:WhatsApp 将最后一条消息显示为:如果它是由 brada 发送的,那将是... 你:你好;但如果是接收器,那就是……我很好。
    【解决方案2】:
    • 获取所需列并为行创建排名,排名设置为最近
    • 但是,由于它是一个时间戳,因此一个 user_id 不能对两条不同的消息拥有相同的时间,因此这应该可以工作
    SELECT 
    CHAT.FRIEND_ID,
    USERS.USERNAME,
    CHAT.MESSAGE,
    USERS.PHOTO,
    USERS.STATUS,
    ROW_NUMBER() OVER(PARTITION BY USER_ID ORDER BY CHAT.MSG_TIME DESC) AS RANK_
    
    FROM USERS
    LEFT JOIN  CHAT 
    ON  USERS.USER_ID = CHAT.USER_ID
    QUALIFY RANK_ = 1
    

    如果限定在您的 sql 中不起作用,则创建一个 cte:

    with main_data as (
    
    SELECT 
    CHAT.FRIEND_ID,
    USERS.USERNAME,
    CHAT.MESSAGE,
    USERS.PHOTO,
    USERS.STATUS,
    ROW_NUMBER() OVER(PARTITION BY USER_ID ORDER BY CHAT.MSG_TIME DESC) AS RANK_
    
    FROM USERS
    LEFT JOIN  CHAT 
    ON  USERS.USER_ID = CHAT.USER_ID
    )
    
    select * from main_data where rank_ = 1
    

    【讨论】:

      猜你喜欢
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      相关资源
      最近更新 更多