クイックフィックスは、サブクエリでフィルタに次のようになります。
SELECT count(d.id) AS dcount, s.id, s.name
FROM sites s
LEFT JOIN deals d ON (s.id = d.site_id AND d.is_active = 1)
WHERE (s.is_active = 1)
AND s.id IN(
SELECT g.site_id
FROM gstats g
WHERE g.start_date > '2015-04-30'AND g.site_id = s.id
GROUP BY g.site_id
HAVING SUM(g.results) > 100
)
GROUP BY s.id
ORDER BY dcount ASC
そうでないので、あなたはすべての可能な候補のために、このようなグループ化のクエリを実行します。今、私たちはすべての要素にEXISTS
を使用しますが、
SELECT count(d.id) AS dcount, s.id, s.name
FROM sites s
LEFT JOIN deals d ON (s.id = d.site_id AND d.is_active = 1)
WHERE (s.is_active = 1)
AND EXISTS ( SELECT 1 FROM gstats g WHERE g.site_id = s.id AND g.start_date > '2015-04-30' HAVING SUM(g.results) > 100 )
GROUP BY s.id
ORDER BY dcount ASC
しかし、我々はまだ終わっていません。私たちは、EXISTS
でこれよりエレガントにすることができます。クエリーはs.id
にのみ依存するため、それは奇妙なので、グループにのみ依存し、個々の行には依存しません。だから、可能性スピードアップが、これはなど、テーブルのサイズに依存してはHAVING
の文に条件を移動することです:
SELECT count(d.id) AS dcount, s.id, s.name
FROM sites s
LEFT JOIN deals d ON (s.id = d.site_id AND d.is_active = 1)
WHERE (s.is_active = 1)
GROUP BY s.id
ORDER BY dcount ASC
HAVING EXISTS (
SELECT 1
FROM gstats g
WHERE g.site_id = s.id AND g.start_date > '2015-04-30'
HAVING SUM(g.results) > 100
)
クエリの前に 'explain'を追加して実行し、結果を私たちと共有できますか? それは –