我正试图找出在postgresql中执行此查询的最佳方法。我有一个消息表,我想抓住用户从每个不同用户收到的最后一条消息。我需要从行中选择所有内容。
我认为这是我想通过发件人ID“msgfromid”分组的地方,但是当我这样做时,它抱怨我没有在我的分组语句中包含我的select语句中的所有内容,但我只想由一列组成,而不是全部。因此,如果我尝试在一列上使用Distinct,它会强制我先通过'distinct on'列(“msgfromid”)进行排序,这会阻止我获得我需要的正确行(按照上次发送的最后一条消息排序)发件人“msgsenttime”)。
我的目标是在我的服务器和数据库上尽可能提高效率。
这就是我现在所拥有的,而不是工作。 (这是我之后用来加入相关信息的另一个查询的子查询,但我认为这是无关紧要的)
SELECT DISTINCT ON ("msgfromid") "msgfromid", "msgid", "msgtoid", "msgsenttime", "msgreadtime", "msgcontent", "msgreportstatus", "senderun", "recipientun"
FROM "messages"
WHERE "msgtoid" = ?
ORDER BY "msgsenttime" desc, "msgfromid"
我想也许如果我在一个子查询中预先订购它可以工作,但它似乎随机选择了一个,这也不是非常有效,即使它是有效的,因为我是把每条消息都拉出来,对吧?:
SELECT DISTINCT ON ("msgfromid") "msgfromid", "msgid", "msgtoid", "msgsenttime", "msgreadtime", "msgcontent", "msgreportstatus", "senderun", "recipientun"
FROM
(
SELECT * FROM "messages"
WHERE "msgtoid" = ?
ORDER BY "msgsenttime" desc
) as "mqo"
感谢您的帮助。
答案 0 :(得分:0)
您的order by
密钥顺序错误:
SELECT DISTINCT ON ("msgfromid") m.*
FROM "messages" m
WHERE "msgtoid" = ?
ORDER BY "msgfromid", "msgsenttime" desc;
对于DISTINCT ON
,括号中的键必须是ORDER BY
中的第一个键。
如果您希望以不同的方式排序最终结果,则需要使用子查询,在外部查询上使用不同的ORDER BY
。