これが理にかなっているかどうか、私は自分自身に尋ねていました:
いくつかのテーブルと結合し、結果をグループ化して(GROUP_CONCAT一部の列で使用するために)、いくつかの結果をフィルターで除外してからHAVING、で並べ替えるクエリがあります。ORDER BY
、はここLIMITでの最後のステートメントです-したがって、基本的に、制限HAVINGは結果を通過するときにのみ有効になりますよね?
私は自分自身に問いかけていました-同じことをしFROMて、すでにその部分を制限している場合はどうなりますか?しかし、それはそれほど単純ではなく、もう少し複雑になります。SUBSELECTLIMIT
意味のある例を思い付くのは難しいです、私には悪い例しかありません:
車には常に4つの車輪があり、すべての車輪には独自のテーブル列があります。したがって、最初の4つのホイールを超えて検索することは意味がありません-MySQLはおそらくそうではないことを私は知っています。したがって、LIMIT 4の後にあるHAVINGということは、4番目に停止した可能性がある場合でも、mysqlがテーブル全体(数百万のホイールをリスト)を検索することを意味します。
基本的に、私の質問は-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?)
MySQLは最初の行を見つけた後、それ以上の行を探すのをやめるので、単一の行を期待しているときに追加してもLIMIT 1、非常に理にかなっていることを読みました。これが、私が副選択について考えている理由です。MySQLはcarwheel、4番目で停止するのではなく、テーブル全体を調べて、LIMITその後にのみ有効になるHAVINGためです。