gpt4 book ai didi

sql - 在没有子查询的 MySQL 中,优先于 GROUP BY 的 ORDER BY

转载 作者:可可西里 更新时间:2023-11-01 06:45:21 34 4
gpt4 key购买 nike

我有以下查询可以执行我想要的操作,但我怀疑可以在没有子查询的情况下执行此操作:

  SELECT * 
FROM (SELECT *
FROM 'versions'
ORDER BY 'ID' DESC) AS X
GROUP BY 'program'

我需要的是按程序分组,但返回“ID”值最高的版本中对象的结果。

根据我过去的经验,像这样的查询应该在 MySQL 中工作,但由于某些原因,它不是:

  SELECT * 
FROM 'versions'
GROUP BY 'program'
ORDER BY MAX('ID') DESC

想要做的是让 MySQL 先执行 ORDER BY,然后执行 GROUP BY,但它坚持先执行 GROUP BY,然后再执行 ORDER BY .即它是对分组的结果进行排序,而不是对排序的结果进行分组。

当然不能这么写

SELECT * FROM 'versions' ORDER BY 'ID' DESC GROUP BY 'program'

谢谢。

最佳答案

根据定义,ORDER BY 在用 GROUP BY 分组之后处理。根据定义,处理任何 SELECT 语句的概念方式是:

  1. 计算 FROM 子句中引用的所有表的笛卡尔积
  2. 应用 FROM 子句中的连接条件来过滤结果
  3. 在 WHERE 子句中应用过滤条件进一步过滤结果
  4. 根据 GROUP BY 子句将结果分组为子集,将每个此类子集的结果折叠到一行并计算任何聚合函数的值 -- SUM(), MAX()AVG() 等——对于每个这样的子集。请注意,如果未指定 GROUP BY 子句,则结果将被视为只有一个子集,并且任何聚合函数都适用于整个结果集,将其折叠为一行。
  5. 根据 HAVING 子句过滤现在分组的结果。
  6. 根据 ORDER BY 子句对结果进行排序。

当然,带有 GROUP BY 子句的 SELECT 结果集中唯一允许的列是

  • GROUP BY 子句中引用的列
  • 聚合函数(例如MAX())
  • 文字/常量
  • 源自上述任何内容的表达方式。

只有损坏的 SQL 实现才允许像 select xxx,yyy,a,b,c FROM foo GROUP BY xxx,yyy — 对 colulmsn a、b 和 c 的引用是无意义的/未定义的,给定各个组已折叠成一行,

关于sql - 在没有子查询的 MySQL 中,优先于 GROUP BY 的 ORDER BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4716369/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com