如何获得由不同列排序的不同结果? SQL Postgresql

时间:2016-11-05 18:03:39

标签: sql postgresql group-by sql-order-by distinct

我正试图找出在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"

感谢您的帮助。

1 个答案:

答案 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