[英]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
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.