我有一个名为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
)
有没有办法通过其他查询获得正确的结果?
答案 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;