orderbydatesql与leftjoin用于消息传递

nom7f22z  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(194)

我有一个问题,似乎很容易解决,但不是。
我有一个mysql数据库,它存储用户、聊天会话和用户的聊天行。
以下是我数据库的uml模式的一部分:

在聊天室会话中,我们只存储所有会话id(自动递增)
在chat\u sessions\u成员中,我们存储所有用户会话
在chat\u行中,我们存储所有chat\u会话行
例子:

问题是如何获取特定用户的会话,同时获取最后一行(如果存在)。
我的最后一次尝试给出了以下代码:

SELECT `chat_sessions_members`.`session_id`, ANY_VALUE(`send_at`) AS `send_at`, ANY_VALUE(`line`) AS `line`
FROM `chat_sessions_members`
LEFT JOIN `chat_lines` ON `chat_sessions_members`.`session_id` = `chat_lines`.`session_id`
WHERE `user_id` = '1'
GROUP BY `session_id`
ORDER BY DATE(`send_at`) DESC

但这不是一个有序的答复。
我知道很多关于这个的帖子,但我不完全理解。

8ulbf1ek

8ulbf1ek1#

如果我理解正确的话,您需要为具有给定用户的每个会话的最后一行(最近的一行)。如果是的话,你可以用 ROW_NUMBER() 识别最后一行 LEFT JOIN 要识别用户:

SELECT cl.*
FROM chat_sessions_members csm LEFT JOIN
     (SELECT cl.*, 
             ROW_NUMBER() OVER (PARTITION BY cl.session_id ORDER BY cl.send_at DESC) as seqnum
      FROM chat_lines cl
     ) cl
     ON cl.session_id = csm.session_id AND seqnum = 1
WHERE csm.user_id = 1
ORDER BY DATE(cl.send_at) DESC;

相关问题