GROUP BY - 排序前后分组
Posted
技术标签:
【中文标题】GROUP BY - 排序前后分组【英文标题】:GROUP BY - sorting pre and post grouping 【发布时间】:2012-01-04 22:46:14 【问题描述】:我的 GROUP BY 查询有问题(至少对我来说是最棘手的)。
我想要做的是检索按另一列分组的最近修改的记录。我看到的问题是分组返回它找到(在组中)的唯一第一条记录,而不考虑 ORDER BY(返回最终结果时除外)。
这是我的代码的简化版本。
SELECT events.id, events.name, events.type, events.modified_time
FROM events
GROUP BY events.type
ORDER BY event.modified_time DESC
哪个会返回:
1 | Event One | Birthday | Jan 1, 2012
2 | Event Two | Graduation | Jan 1, 2012
实际上有第三条记录的修改时间更晚:
3 | Event Three | Birthday | Jan 2, 2012
我尝试使用 MAX(modified_time) 的 HAVING 子句,但它也没有返回正确的结果。也许我只需要与知识渊博的人进行更多讨论,但如果这个问题足够有意义并且你能说出我需要什么,那么也许会有一个简单的答案。
额外问题: 没有子查询是否可以做到这一点?
【问题讨论】:
你不能在 GROUP BY 子句中添加events.modified_time
吗?
@Lieven 那么当我真的想要最新的 2 条记录时,我会得到 3 条记录。
ORDER BY 不会影响 GROUP BY,如果你愿意的话,只会影响最终排序。
***.com/questions/tagged/greatest-n-per-group+mysql
请注意,这仅“有效”,因为它是 MySQL - 这不会在大多数 RDBMS 上运行。具体来说,要么需要向GROUP BY
添加更多列,要么需要应用聚合函数(SUM()
、MAX()
等)。 MySQL 为您 (sorta) random 为其他未正确处理的列提供值(这是 stupid - 您得到的可能是 invalid 结果,它甚至没有告诉你)。
【参考方案1】:
在许多其他方法中,这可能对您有用:
SELECT a.id, a.name, a.[type], a.modified_time
FROM [events] AS a
JOIN (
SELECT MAX([events].id) AS id, [events].[type]
FROM [events]
GROUP BY [events].[type]
) AS b ON a.id = b.id AND a.[type] = b.[type]
ORDER BY a.modified_time DESC
【讨论】:
您假设较大的 id 始终对应于较晚的 modified_time。 大声笑......我拥有的链接解决方案也显示了另一种方式。我猜我们会看看 OP 想要什么! @TimLehner 由于 OP 是按type
分组并要求最近的 modified_time
的记录,因此它是有效的。
@Michael Mior 我仍然会说这两个假设都是潜在的陷阱,只有拥有数据的人才能评估。
@kurosch 感谢您先发制人地指出我想要的东西。另外,是的,id 是 key,modified_time 可以稍后更改。【参考方案2】:
GROUP BY/HAVING 不是你想要的。你想要的是:
WHERE
events.modified_time = ( select max(modified_time) from events e2 where e2.type = events.type )
...或者像 Tim 这样的解决方案链接到使用像 ROW_NUMBER 这样的分析函数
【讨论】:
请注意,如果您有多个相同类型的事件具有相同的 modified_time,则这样的条件将返回所有事件。 AFAIK,MySQL 没有类似 SQL Server 的 ROW_NUMBER 的概念。 请注意,ROW_NUMBER
在 MySQL 中不存在。
@Lieven:只是一个小问题:它不是“SQL Server 的”row_number()。这称为窗口函数(标准 ANSI SQL),Oracle 和其他人自古就有它——而且功能也更强大。
@a_horse_with_no_name - 我知道,但提到的链接是关于 SQL Server 的,因此我参考了它。以上是关于GROUP BY - 排序前后分组的主要内容,如果未能解决你的问题,请参考以下文章
MYSQL05_ORDR BY排序LIMIT分组GROUP BY分组
SQL语句中,如果有group by 和order by两个语句,是先分组还是先排序?