sql >> Databasteknik >  >> RDS >> Mysql

Långsam fråga med HAVING-klausul - kan jag snabba upp det?

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
)


  1. Hur man räknar antalet rader i en tabell i SQL

  2. MYSQL inaktivera Auto-trim

  3. Hur väljer man från två tabeller i MySQL även om inte alla rader i en tabell har korrespondenter i den andra?

  4. Highchart- Använder PHP, MYSQL och jQuery.get för att analysera data