繁体   English   中英

如何从每个对话中获取最后一条消息

[英]How to get last message from each conversation

我想显示用户好友的最近消息列表; 就像 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

我希望 output 对于 brada 是这样的: friend_id username message photo status

 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 )

也许这个?

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
  • 获取所需的列并为行创建排名,排名设置为最近
  • 然而,由于它是一个时间戳,一个 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

如果 qualify 在您的 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

暂无
暂无

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

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