SQL-如何选择所有聊天并按最新消息排序
我正在创建一个简单的聊天应用程序,我想选择所有的SQL-如何选择所有聊天并按最新消息排序,sql,Sql,我正在创建一个简单的聊天应用程序,我想选择所有的聊天,并根据他们最近的消息(列已创建)。 这两个表是分开的,如下所述: 聊天 消息 为了实现这一点,我编写了以下SQL脚本: SELECT * CHAT AS chat LEFT JOIN MESSAGE AS message ON chat.ID = message.CHAT_ID GROUP BY chat.ID ORDER BY message.CREATED_ON 当我运行该脚本时,结果不是按最近的消息排序,而是随机排序。 我还注意到
聊天
,并根据他们最近的消息
(列已创建
)。
这两个表是分开的,如下所述:
聊天
消息
为了实现这一点,我编写了以下SQL脚本:
SELECT * CHAT AS chat LEFT JOIN MESSAGE AS message ON chat.ID = message.CHAT_ID
GROUP BY chat.ID
ORDER BY message.CREATED_ON
当我运行该脚本时,结果不是按最近的消息排序,而是随机排序。
我还注意到脚本速度不快。您的查询格式不正确,因为您正在使用
SELECT*
和groupby
。(这会忽略其他语法错误,例如缺少FROM
子句。)您的查询应该返回错误
您似乎不仅希望订购聊天记录,还希望包含最新消息。为此,请使用窗口功能:
SELECT c.*, m.*
FROM chat c LEFT JOIN
(SELECT m.*,
ROW_NUMBER() OVER (PARTITION BY m.chat_id ORDER BY m.CREATED_ON DESC) as seqnum
FROM MESSAGE m
) m
ON c.ID = m.CHAT_ID AND m.seqnum = 1
ORDER BY m.CREATED_ON DESC;
在大多数数据库中,
消息(chat\u id,created\u on)
上的索引会有所帮助。我删除了不一致的数据库标记。请标记您真正使用的数据库。谢谢。你的问题正是我想要的。但是,有没有一种方法可以在不使用windows函数的情况下实现相同的结果呢?因为我使用的是NodeJS库类型表和左连接后的子查询似乎不受支持。@Manu。备选方案都将使用子查询。