我正在为应用程序构建消息传递功能,我的数据库表如下所示:
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
在它变得明显之前进行排序。
ORDER BY
中的主要表达必须与DISTINCT ON
中的表达一致:
SELECT DISTINCT ON ("threadId") *
FROM messages
ORDER BY "threadId", "createdAt" DESC;
详细说明:
如果要以不同的方式(如注释)对结果进行排序,则必须使用第二个ORDER BY
将查询包装在外部查询中。看到:
或者类似,取决于您的具体情况和要求。获得最佳结果可能很复杂。最近的例子: