SQL - 如何选择所有聊天并按最新消息排序

标签 sql

我正在创建一个简单的聊天应用程序,我想选择所有 Chat 并按它们最近的 Message 对它们进行排序(列 created_on ) 。 2个表是分开的,说明如下:

聊天 enter image description here

消息 enter image description here

为此,我编写了以下 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

当我运行该脚本时,结果不是按最新 Message 排序,而是随机排序。 而且我还注意到脚本并不快。

最佳答案

您的查询格式不正确,因为您将 SELECT *GROUP BY 一起使用。 (这会忽略其他语法错误,例如缺少 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;

在大多数数据库中,message(chat_id, created_on) 上的索引会有所帮助。

关于SQL - 如何选择所有聊天并按最新消息排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67034248/

相关文章:

c# - LINQ To SQL - 获取已运行的 SQL

mysql - 带条件和的内连接

sql - 如何使用 sql 检测错误的序列列?

mysql - 使用 AS 避免相同的查询 mySQL

php - 在 INSERT (PHP) 中将 2 个不同的查询合并为一个

Sqlite 联合和排序顺序

asp.net - 如何为 select 语句 where 列 IN 编写查询

mysql - 我可以将多个 MySQL 行连接到一个字段中吗?

Mysql:如何用当前-x行的值更新当前行?

sql - Mysql 使用 JOIN 和 WHERE 语句。这是什么区别?