एक त्वरित समाधान यह होगा कि फ़िल्टर सबक्वेरी में:
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
)