我有一个看似简单解决,实则不然的问题。
我有一个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
但这不是一个有序的答复。
我知道很多关于这个的帖子,但我不是所有的都懂。
如果我理解正确的话,您希望每个具有给定用户的会话的最后(最近)行。 如果是,则可以使用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;