我有一个问题似乎很容易解决,但不是。
我有一个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;