3 回答
TA贡献1966条经验 获得超4个赞
在这一点上阅读MySQL文档。
简而言之,MySQL出于性能考虑,允许从GROUP BY中删除某些列,但是,只有在被省略的列都具有相同值(在分组内)的情况下,此方法才有效,否则,查询返回的值的确是不确定的,例如在这篇文章中被其他人正确猜到了。确保添加ORDER BY子句不会重新引入任何形式的确定性行为。
尽管不是问题的核心,但本示例说明如何使用*而不是对所需列进行显式枚举通常是一个坏主意。
摘自MySQL 5.0文档:
使用此功能时,每个组中的所有行应具有相同的值
对于GROUP BY部分中省略的列。服务器是免费的
从组中返回任何值,因此结果是不确定的,除非
所有值都相同。
TA贡献1789条经验 获得超10个赞
这有点晚了,但我会提出来供将来参考。
GROUP BY接收具有重复项的第一行,并丢弃结果集中第二行之后的所有匹配行。因此,如果杰克和汤姆具有相同的部门,则在普通SELECT中首先出现的人将是GROUP BY中的结果行。
如果要控制列表中第一个出现的内容,则需要执行ORDER BY。但是,SQL不允许ORDER BY出现在GROUP BY之前,因为它将引发异常。解决此问题的最佳方法是在子查询中执行ORDER BY,然后在外部查询中执行GROUP BY。这是一个例子:
SELECT * FROM (SELECT * FROM emp ORDER BY name) as foo GROUP BY dept
这是我发现的性能最好的技术。我希望这可以帮助某人。
TA贡献1831条经验 获得超4个赞
我发现最好的办法是考虑不支持这种类型的查询。在大多数其他数据库系统中,不能在GROUP BY子句中或HAVING,SELECT或ORDER BY子句中的聚合函数中都不包含列。
相反,请考虑您的查询读取:
SELECT ANY(name), dept, ANY(salary)
FROM emp
GROUP BY dept;
...因为这是怎么回事。
希望这可以帮助....
添加回答
举报