2017-10-28 190 views
0

我有一个表messages,列Id, SenderAccountId, ReceiverAccountId, Message, DateTimeSQL - ORDER BY,GROUP BY,ID

当我尝试只用这个查询选择每个SenderAccountId最新的消息:

SELECT * 
FROM messages 
GROUP BY SenderAccountId 
ORDER BY DateTime ASC 

我得到这个错误:

Msg 8120, Level 16, State 1, Line 1
Column 'Chats.Id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

但是,当我改变SELECT到

SELECT SenderAccountId, ReceiverAccountId, Message, DateTime 

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

有没有办法让另一个查询得到正确的结果?

+0

没有聚合函数(SUM,MAX,等等)在您的查询的“分组依据”。 – Jon

+0

我必须得到程序其余部分的所有列,所以聚合函数不是一个不幸的选项 – BasTolen

+0

当在SQL Server中使用GROUP BY时,规则非常简单:** SELECT中的每个**列列的列表(你真的应该使用**明确的列列表** - 不只是'*'!)**必须是**(SUM,COUNT,AVG,MIN,MAX),**或者** it **必须包含在'GROUP BY'语句中。如果您根本没有任何聚合,“GROUP BY”确实根本没有任何意义... –

回答

0

你不应该被不aggreation功能使用组(如MAX(),COUNT(),MIN())

如果同比想不同的结果,你应该使用disticnt条款,这避免*(所有列)

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

由于日期时间和ID,不幸的是不可能。我必须得到程序其余部分的所有列,所以聚合函数不是一个不幸的选项 – BasTolen

+0

您必须记住,在大多数数据库和最新版本的mysql中不允许使用group by by aggreation函数(从MySQL 5.7开始),所以如果你想要不同的结果,你必须在select中使用distinct子句和explicti列名 – scaisEdge

0

的MySQL扩展了标准SQL使用GROUP BY的,这样的选择列表可参考在GROUP不BY子句中命名非聚合列。

check this文档了解更多详情。

1

你似乎在寻找类似:

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

聚集是不是真的写此查询正确的方法。你想思考“过滤”,而不是。

0

您可以使用下面的查询:

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