我正在为应用程序构建消息传递功能,我的数据库表如下所示:
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
必须先确定其顺序。
答案 0 :(得分:2)
ORDER BY
中领先的表达式必须与DISTINCT ON
中的表达式一致:
SELECT DISTINCT ON ("threadId") *
FROM messages
ORDER BY "threadId", "createdAt" DESC;
详细说明:
如果要以不同的方式对结果进行排序(如注释),则必须用第二个{{1 }}。参见:
或类似,取决于您的实际情况和要求。可能会有复杂性以获得最佳结果。最近的例子: