如何从按日期排序的SQL查询中选择1列?

时间:2013-06-24 03:42:07

标签: sql postgresql

所以我有一个私人消息模型,其中包含以下列:sender_idrecipient_idcontentcreated_at

我想选择我收到的最后5位收件人。但是,我无法弄清楚如何缩小列。

我目前的疑问是:

SELECT DISTINCT recipient_id, created_at FROM private_messages WHERE sender_id = :user_id ORDER BY created_at DESC LIMIT 5

我无法摆脱created_at列,因为ORDER BY需要它。我必须遗漏一些东西,但我不完全确定它是什么。

6 个答案:

答案 0 :(得分:2)

....我无法摆脱created_at列,因为它对于ORDER BY是必要的。

没有

在SELECT列列表中不需要存在Order By cluase中的列。 您可以在查询的SELECT列表中省略created_at列。其余的查询将正常工作。

选中 SQL FIDDLE ,其中显示上述事实。

答案 1 :(得分:0)

您是否尝试过以下内容:

SELECT TOP 5  recipient_id
FROM private_messages 
WHERE sender_id = :user_id 
GROUP BY recipient_id
ORDER BY created_at DESC

我相信你不需要在你的选择中使用created_at来在order by子句中使用它。这可能取决于您使用的数据库系统,在SQL服务器中它将允许这样做。

答案 2 :(得分:0)

试试这个:SELECT DISTINCT recipient_id,created_at FROM private_messages WHERE sender_id =:user_id GROUP BY recipient_id ORDER BY created_at DESC LIMIT 5

答案 3 :(得分:0)

尝试: SELECT recipient_id FROM(SELECT recipient_id,MAX(created_at)as created_at FROM private_messages WHERE sender_id =:user_id GROUP BY recipient_id)ORDER BY created_at DESC LIMIT 5;

答案 4 :(得分:0)

您无法省略该列。这已经被添加到SQL标准中了。

  

对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表

引自here(来自汤姆莱恩的消息。)

  

实际上有一个定义的原因。考虑

     

SELECT DISTINCT x FROM tab ORDER BY y;

     

对于表中的任何特定x值,可能存在许多不同的y值   值。您将使用哪一个来对输出中的x值进行排序?

     

回到SQL92,他们通过指定ORDER BY来避免这个问题   条目必须引用输出列。 SQL99有一些杂乱的措辞   我认为与我们的限制在同一个地方出现

例如,Oracle不强制执行此规则(10g或11g)。

答案 5 :(得分:0)

试试这个

 WITH t AS ( SELECT max(created_at) AS created_at, recipient_id  FROM messages 
 GROUP BY recipient_id  )

 SELECT created_at, recipient_id   FROM t ORDER BY created_at DESC LIMIT 5