我有以下查询,它可以完成我想要的操作,但我怀疑可以在没有子查询的情况下执行此操作:
SELECT *
FROM (SELECT *
FROM 'versions'
ORDER BY 'ID' DESC) AS X
GROUP BY 'program'
我需要的是按程序分组,但返回具有最高“ID”值的版本中的对象的结果。
根据我过去的经验,这样的查询should在 MySQL 中工作,但由于某种原因,它不是:
SELECT *
FROM 'versions'
GROUP BY 'program'
ORDER BY MAX('ID') DESC
What I want要做的就是让 MySQL 首先执行 ORDER BYthenGROUP BY,但它坚持先执行 GROUP BY,然后再执行 ORDER BY。即它对分组的结果进行排序,而不是对排序的结果进行分组。
当然不可以这样写
SELECT * FROM 'versions' ORDER BY 'ID' DESC GROUP BY 'program'
Thanks.
根据定义,ORDER BY 被处理after使用 GROUP BY 进行分组。根据定义,处理任何 SELECT 语句的概念方式是:
- 计算 FROM 子句中引用的所有表的笛卡尔积
- 应用 FROM 子句中的联接条件来过滤结果
- 应用 WHERE 子句中的过滤条件来进一步过滤结果
- 根据 GROUP BY 子句将结果分组为子集,将每个此类子集的结果折叠为一行,并计算任何聚合函数的值 -
SUM()
, MAX()
, AVG()
等等——对于每个这样的子集。请注意,如果未指定 GROUP BY 子句,则结果将被视为只有一个子集,并且任何聚合函数都适用于整个结果集,将其折叠为单行。
- 根据 HAVING 子句过滤现在分组的结果。
- 根据 ORDER BY 子句对结果进行排序。
当然,带有 GROUP BY 子句的 SELECT 结果集中允许的唯一列是:
- GROUP BY 子句中引用的列
- 聚合函数(例如
MAX()
)
- 文字/常量
- 从上述任何一个派生的表达式。
只有损坏的 SQL 实现才允许这样的事情select xxx,yyy,a,b,c FROM foo GROUP BY xxx,yyy
— 对列 a、b 和 c 的引用没有意义/未定义,因为各个组已折叠为单行,
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)