【问题标题】:How to get a distinct result ordered by a different column? SQL Postgresql如何获得由不同列排序的不同结果? SQL Postgresql
【发布时间】:2016-11-05 18:03:39
【问题描述】:

我正在尝试找出在 postgresql 中执行此查询的最佳方法。我有一个消息表,我想获取用户从每个不同用户那里收到的最后一条消息。我需要从行中选择所有内容。

我认为这是我想按发件人 ID“msgfromid”分组的地方,但是当我这样做时,它抱怨我没有将我的 select 语句中的所有内容都包含在我的 group by 语句中,但我只想按一列分组,而不是全部。因此,如果我尝试在单列上使用 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"

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    您的order by 键顺序错误:

    SELECT DISTINCT ON ("msgfromid") m.*
    FROM "messages" m 
    WHERE "msgtoid" = ?
    ORDER BY "msgfromid", "msgsenttime" desc;
    

    对于DISTINCT ON,括号中的键需要是ORDER BY中的第一个键。

    如果您希望最终结果以不同的方式排序,那么您需要使用子查询,在外部查询上使用不同的ORDER BY

    【讨论】:

    • 我发誓我确实做到了,但它没有奏效,但现在我再次尝试它确实有效。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-12-09
    • 2023-02-11
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    相关资源
    最近更新 更多