ORDER BY date SQL with LEFT JOIN 用于消息传递

Posted

技术标签:

【中文标题】ORDER BY date SQL with LEFT JOIN 用于消息传递【英文标题】:ORDER BY date SQL with LEFT JOIN for messaging 【发布时间】:2020-06-06 10:43:37 【问题描述】:

我有一个问题似乎很容易解决,但实际上并非如此。

我有一个 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

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

我知道很多帖子谈论这个,但我不明白所有这些。

【问题讨论】:

你不说你想要返回什么,输出如何是输入的函数。这还不清楚。使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。在给出业务关系(船舶)/关联或表(基础或查询结果)时,说明其中的一行根据其列值说明了业务情况。请不要大喊。请use text, not images/links, for text--including tables & ERDs。仅将图像用于无法表达为文本或扩充文本的内容。 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。 【参考方案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;

【讨论】:

非常感谢!我真的以为我的主题不可读 将来你能解释这个请求吗?它可以帮助几个人

以上是关于ORDER BY date SQL with LEFT JOIN 用于消息传递的主要内容,如果未能解决你的问题,请参考以下文章

使用group by with order一起查询时间慢

ORDER BY clause is not in GROUP BY.this is incompatible with sql_mode=only_full_group_by 异常分析解决

ORDER BY clause is not in GROUP BY.this is incompatible with sql_mode=only_full_group_by 异常分析解决

如何使用Order By和With子句

php 网页 order by 排序无效

sql不用order by查找第二的思路