Mysql 按日期排序的SQL,带有用于消息传递的左联接
我有一个问题似乎很容易解决,但事实并非如此 我有一个MySQl数据库,存储用户、聊天会话和用户的聊天线路 以下是我的数据库的UML模式的一部分: 在聊天室会话中,我们只存储所有会话id(自动递增)Mysql 按日期排序的SQL,带有用于消息传递的左联接,mysql,sql,left-join,sql-order-by,Mysql,Sql,Left Join,Sql Order By,我有一个问题似乎很容易解决,但事实并非如此 我有一个MySQl数据库,存储用户、聊天会话和用户的聊天线路 以下是我的数据库的UML模式的一部分: 在聊天室会话中,我们只存储所有会话id(自动递增) 在聊天室会话成员中,我们存储所有用户会话 在聊天行中,我们存储所有聊天会话行 例如: 问题是如何获取特定用户的会话,同时获取最后一行(如果存在) 我的最后一次尝试给出了以下代码: 选择'chat\u sessions\u members`.'session\u id`,任意值('send\u at
在聊天室会话成员中,我们存储所有用户会话
在聊天行中,我们存储所有聊天会话行 例如: 问题是如何获取特定用户的会话,同时获取最后一行(如果存在) 我的最后一次尝试给出了以下代码:
选择'chat\u sessions\u members`.'session\u id`,任意值('send\u at`)作为'send\u at`,任意值('line`)作为'line``
来自“聊天”会话\u成员`
左键加入“聊天会话成员”上的“聊天线路”。“会话id”=“聊天线路”。“会话id”`
其中'user\u id`='1'
按“会话”id分组`
按日期订购(`send_at`)说明
但这不是一个有序的答复
我知道很多关于这一点的帖子,但我不完全理解。如果我理解正确,您希望每个会话都有一个给定用户的最后一行(最近一行)。如果是这样,您可以使用
ROW\u 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;
你不需要说你想要返回什么,输出是输入的函数。这还不清楚。使用足够的单词、句子和引用部分例子,清楚、完整地说出你的意思。当给出一个业务关系(ship)/关联或表(base或query result)时,请说明其中的一行根据其列值表示的业务状况。请不要大喊大叫。仅将图像用于无法表示为文本或扩充文本的内容。请在代码问题中给出--cut&paste&runnable代码,包括作为代码输入的最小代表性示例;期望和实际输出(包括逐字记录错误消息);标签和版本;清晰的说明和解释。尽可能少地给出代码,即显示为OK的代码,并通过显示为not OK的代码进行扩展。(调试基础。)用于包含DBMS和DDL(包括约束和索引)的SQL,并将其作为格式化为表的代码输入。在总体目标上暂停工作,在第一个表达中删去代码,不要给出你所期望的,说出你所期望的,为什么。非常感谢!我真的认为我的主题在将来是不可读的你能解释这个请求吗?它可以帮助几个人