我只是在问自己,这是否有意义:
我有一个与几个表连接的查询,对结果进行分组(GROUP_CONCAT在某些列上使用),然后用 过滤掉一些结果HAVING,然后用ORDER BY
,LIMIT是这里的最后一条语句 - 所以基本上,限制仅在查看结果时才生效HAVING,对吧?
我在问自己——如果我已经通过同样的方式来限制FROM部分怎么办?但这并不是那么简单,它变得有点复杂:SUBSELECTLIMIT
很难想出一个有意义的例子,我只有一个不好的例子:
一辆车总是有 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,对吗?