En snabb lösning skulle vara att filtrera i underfrågan:
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
Annars gör du en sådan grupperingsfråga för alla möjliga kandidater. Vi kan göra detta mer elegant med 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
Men vi är inte klara än, nu kommer vi att använda EXISTS
för varje element. Det är konstigt eftersom frågan bara beror på s.id
, så det beror bara på gruppen , inte de enskilda raderna. Alltså en potential snabbare, men detta beror på storleken på tabellerna, etc. är att flytta villkoret till en HAVING
uttalande:
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
)