所以我有一个私人消息模型,其中包含以下列:sender_id
,recipient_id
,content
和created_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
需要它。我必须遗漏一些东西,但我不完全确定它是什么。
答案 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