在一列上获得不同,按另一列排序

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

我正在为应用程序构建消息传递功能,我的数据库表如下所示:

messages:
  id
  senderId
  receiverId
  threadId   <-- every message is part of a thread
  createdAt

我有一个“消息”页面,每个消息线程都有一张卡片,但是我想让它在卡片中显示最新消息作为每个帖子的预览。这是我到目前为止所写的查询:

SELECT DISTINCT ON ("threadId") * FROM messages ORDER BY "createdAt" DESC;

所以我正在做DISTINCT ON ("threadId"),但我也选择所有列,因为我想要所有的数据,这就是为什么在*条款之后有一个DISTINCT ON。直到这一点,这个查询工作正常,但现在它在ORDER BY子句上失败了。我想返回最后创建的消息,但是我收到一个错误:

ERROR:  SELECT DISTINCT ON expressions must match initial ORDER BY expressions
LINE 1: SELECT DISTINCT ON ("threadId") * FROM messages order by "cr...

我理解我认为的错误(ORDER BY列必须与DISTINCT ON应用的列相匹配)但我不知道如何使查询成为我想要的,这将由createdAt在它变得明显之前进行排序。

sql postgresql greatest-n-per-group
1个回答
2
投票

ORDER BY中的主要表达必须与DISTINCT ON中的表达一致:

SELECT DISTINCT ON ("threadId") *
FROM   messages
ORDER  BY "threadId", "createdAt" DESC;

详细说明:


如果要以不同的方式(如注释)对结果进行排序,则必须使用第二个ORDER BY将查询包装在外部查询中。看到:

或者类似,取决于您的具体情况和要求。获得最佳结果可能很复杂。最近的例子:

© www.soinside.com 2019 - 2024. All rights reserved.