首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GROUP BY / HAVING?

在GROUP BY / HAVING?
EN

Stack Overflow用户
提问于 2012-12-06 16:01:06
回答 1查看 3.1K关注 0票数 0

我只是在问自己,这是否有意义:

我有一个查询,它连接几个表,对结果进行分组(在某些列上使用GROUP_CONCAT ),然后使用HAVING过滤掉一些结果,然后使用ORDER BY对它们进行排序

LIMIT是这里的最后一条语句,所以基本上,限制只在HAVING遍历结果时生效,对吗?

我在问自己-如果我已经限制了FROM部分,通过使用相同的LIMIT执行SUBSELECT会怎么样?但这并不是那么简单,它变得有点复杂:

很难想出一个有意义的例子,我只有一个糟糕的例子:

一辆车总是有4个轮子,每个轮子都有自己的表行。因此,搜索通过前4个轮子是没有意义的-我知道,MySQL可能不会。因此,在HAVING之后使用LIMIT 4,将意味着mysql搜索遍及整个表(列出数百万个轮子),即使它本可以在第四个表中停止搜索。

基本上,我的问题是- SUBSELECT在下面的查询中有意义吗?

不使用SUBSELECT

代码语言:javascript
复制
SELECT    *
FROM      carwheel
LEFT JOIN ... ON ...
LEFT JOIN ... ON ...
LEFT JOIN ... ON ...
WHERE     ...
GROUP BY  ...
HAVING    ...
ORDER BY  ...
LIMIT     4

使用SUBSELECT

代码语言:javascript
复制
SELECT   *
FROM     (
             SELECT *
             FROM   carwheel
             WHERE  ... -- (first, simple filter)
             LIMIT  4
         ) AS carwheel
LEFT JOIN ... ON ...
LEFT JOIN ... ON ...
LEFT JOIN ... ON ...
WHERE     ...
GROUP BY  ...
HAVING    ...
ORDER BY  ...
LIMIT     4 -- (does it make sense, to do it twice?)

我读到过,即使在需要一行的时候添加LIMIT 1也很有意义,因为MySQL在找到第一行后会停下来寻找更多的行。这就是我考虑subselect的全部原因,因为如果LIMIT只在HAVING之后生效,那么MySQL将遍历整个carwheel表,而不是在第4个表停止,对吧?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-06 16:07:57

您会得到不同的结果,因为当您在from子选择中进行限制时,顺序是未定义的。在这两种情况下,您都会得到四行,但在一种情况下,您可能会得到第7、14、23、8行,而在另一种情况下,您可能会得到第1、2、88、17行。因此,限制结果集以最小化通信量是有意义的,但请记住,根据您限制的位置,您会得到不同的行。

编辑

澄清之后,在from子句中预过滤行是有意义的,因为这样连接需要处理的行数就更少了。第二个限制也很有用,因为使用left join可以在结果集中获得四行以上的数据。

但要确定哪一个更好,请对这两个查询执行explain select ...。然后,您可以比较这两个选择,看看哪一个更有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13739276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档