提问者:小点点

使用左联接按日期排序SQL进行消息传递[closed]


我有一个看似简单解决,实则不然的问题。

我有一个MySQl数据库,存储用户,聊天会话和用户的聊天行。

下面是我的数据库的UML模式的一部分:

在chat_sessions中,我们只存储所有会话id(自动递增)
在chat_sessions_members中,我们存储所有用户会话
在chat_lines中,我们存储所有行chat_sessions

示例:

问题是如何获取特定用户的会话,同时获取存在的最后一行。

最后一次尝试给出了以下代码:

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

但这不是一个有序的答复。

我知道很多关于这个的帖子,但我不是所有的都懂。


共1个答案

匿名用户

如果我理解正确的话,您希望每个具有给定用户的会话的最后(最近)行。 如果是,则可以使用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;