【发布时间】: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