ORDER BY日期SQL,带有用于消息传递的LEFT JOIN

问题描述 投票:-1回答:1

我有一个问题似乎很容易解决,但不是。

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

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

uml schema

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

示例:

Table data

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

我的上次尝试给了我这个代码:

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

但这不是命令答复。

我知道很多关于此事的话题,但我并不全部理解。

mysql sql left-join sql-order-by
1个回答
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;
© www.soinside.com 2019 - 2024. All rights reserved.