这两种 MySQL 查询形式总是等价的吗?分组依据 + 排序依据 + 限制

Posted

技术标签:

【中文标题】这两种 MySQL 查询形式总是等价的吗?分组依据 + 排序依据 + 限制【英文标题】:Are these two MySQL query forms always equivalent? GROUP BY + ORDER BY + LIMIT 【发布时间】:2013-01-16 02:21:47 【问题描述】:

我遇到了优化问题,以下更改似乎可以作为解决方法:

之前(100+s):

SELECT t1.*,t2.a AS t2_a,t2.b AS t2_b FROM ... JOIN ... WHERE ... GROUP BY ... ORDER BY ... LIMIT 5

之后(0.01s):

SELECT * FROM
    (SELECT t1.*,t2.a AS t2_a,t2.b AS t2_b FROM ... JOIN ... WHERE ... GROUP BY ... ORDER BY ...) AS x
LIMIT 5

抛开这种类型的优化是否最适合我的情况的问题(我的研究告诉我它对我来说是最实用的),这两种形式是否保证在所有情况下都返回相同的结果?

我们可以假设内部查询可能有许多 JOIN,但没有其他子查询或 UNION(即是一个简单的 SELECT)。在我的情况下,内部查询可能会因用户输入而有很大差异,所以这就是我将其构建为关于查询表单的一般问题的原因。

【问题讨论】:

【参考方案1】:

唯一的区别是后者将有一个额外的“步骤”来使用派生查询。否则,结果将是相同的。

【讨论】:

以上是关于这两种 MySQL 查询形式总是等价的吗?分组依据 + 排序依据 + 限制的主要内容,如果未能解决你的问题,请参考以下文章

【MySQL】分组查询(GROUP BY)

MySQL更新查询与左连接和分组依据

R中的累积和、移动平均线和SQL“分组依据”等价物

mysql带条件查询,联表查询

oracle和mysql中分组取特定的某一行的数据

分组查询