我只是在问自己,这是否有意义:
我有一个与几个表连接的查询,对结果进行分组(GROUP_CONCAT
在某些列上使用),然后用 过滤掉一些结果HAVING
,然后用ORDER BY
,LIMIT
是这里的最后一条语句 - 所以基本上,限制仅在查看结果时才生效HAVING
,对吧?
我在问自己——如果我已经通过同样的方式来限制FROM
部分怎么办?但这并不是那么简单,它变得有点复杂:SUBSELECT
LIMIT
很难想出一个有意义的例子,我只有一个不好的例子:
一辆车总是有 4 个轮子,每个轮子都有自己的桌子排。所以搜索前 4 个轮子是没有意义的——我知道,MySQL 可能没有。因此,在 ,LIMIT 4
之后HAVING
意味着 mysql 搜索整个表(列出数百万个轮子),即使它本可以在 4 号停止。
基本上,我的问题是 -SUBSELECT
下面的查询有意义吗?
没有SUBSELECT
:
SELECT *
FROM carwheel
LEFT JOIN ... ON ...
LEFT JOIN ... ON ...
LEFT JOIN ... ON ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT 4
与SUBSELECT
:
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 在找到第一行后停止寻找更多行。这就是我考虑子选择的全部原因,因为 MySQL 会查看整个carwheel
表,而不是在第 4 位停止,如果LIMIT
仅在 之后生效HAVING
,对吗?