SQL - 带有id的ORDER BY,GROUP BY

时间:2017-10-28 21:16:51

标签: sql sql-server tsql

我有一个名为messages的表格,列Id, SenderAccountId, ReceiverAccountId, Message, DateTime

当我尝试仅使用此查询选择每个SenderAccountId的最新消息时:

SELECT *
FROM messages
GROUP BY SenderAccountId
ORDER BY DateTime ASC

我收到此错误:

  

Msg 8120,Level 16,State 1,Line 1
  专栏' Chats.Id'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

但是当我将SELECT更改为

SELECT SenderAccountId, ReceiverAccountId, Message, DateTime 

我的错误只是移动到下一列(所以:SenderAccountId

有没有办法通过其他查询获得正确的结果?

4 个答案:

答案 0 :(得分:1)

你似乎在寻找类似的东西:

SELECT m.*
FROM messages m
WHERE m.DateTime = (SELECT MAX(m2.DateTime) FROM messages m2 WHERE m2.SenderAccountId = m.SenderAccountId);

聚合并不是编写此查询的正确方法。你想要思考"过滤"代替。

答案 1 :(得分:0)

你不应该在没有聚合功能的情况下使用group by(如max(),count(),min())

如果你想要不同的结果,你应该使用disticnt子句,为此避免*(ALL COLUMN)

SELECT distinct col1, col2..., coln
FROM messages
ORDER BY DateTime ASC'

答案 2 :(得分:0)

MySQL扩展了GROUP BY的标准SQL使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列。

check this文档了解更多详情。

答案 3 :(得分:0)

您可以使用以下查询:

SELECT m1.* FROM messages m1
inner join 
(SELECT SenderAccountId, MAX(DateTime) FROM messages group by SenderAccountId) as m2
on m1.SenderAccountId = m2.SenderAccountId;