在单个查询中分组并按顺序排列

时间:2014-06-05 17:27:28

标签: sql postgresql

我有两个表:topicmessage

topic

topic_id
// some other not important columns here

message

message_id
topic_id
creation_date
// some other not important columns here

如您所见,每个主题都可以包含许多消息。

我想要获取的是:所有主题的列表(包含所有主题列)以及每个主题的消息计数按照属于主题的最新消息排序(最新消息的主题位于顶部)。

这是我的尝试:

SELECT topic.*, COUNT(message.message_id)
FROM topic LEFT OUTER JOIN message ON topic.topic_id = message.topic_id
GROUP BY topic.topic_id
ORDER BY message.creation_date DESC

这显然不起作用。我将不胜感激任何帮助。

1 个答案:

答案 0 :(得分:3)

您的尝试不起作用的原因是message.creation_date查询生成的列中没有GROUP BY

您可以将其添加到输出中,并在排序中使用它,如下所示:

SELECT
    topic.*
,   COUNT(message.message_id) cnt
,   MAX(message.creation_date) last_msg
FROM topic LEFT OUTER JOIN message ON topic.topic_id = message.topic_id
GROUP BY topic.topic_id
ORDER BY last_msg DESC

您应该能够在不为其定义列的情况下进行排序,如下所示:

SELECT topic.*, COUNT(message.message_id)
FROM topic LEFT OUTER JOIN message ON topic.topic_id = message.topic_id
GROUP BY topic.topic_id
ORDER BY MAX(message.creation_date) DESC