Problem:
Du vil finde grupper af rækker med et bestemt antal poster i en gruppe.
Eksempel:
Vores database har en tabel med navnet product
med data i følgende kolonner:id
, name
og category
.
id | navn | kategori |
---|---|---|
1 | sofa | møbler |
2 | handsker | tøj |
3 | T-shirt | tøj |
4 | stol | møbler |
5 | skrivebord | møbler |
6 | se | elektronik |
7 | lænestol | møbler |
8 | nederdel | tøj |
9 | radiomodtager | elektronik |
Lad os finde kategorien af produkter med mere end to poster.
Løsning:
SELECT category, COUNT(id) FROM product GROUP BY category HAVING COUNT(id)>2;
Her er resultaterne:
kategori | tæller |
---|---|
møbler | 4 |
tøj | 3 |
Diskussion:
For at filtrere poster i henhold til det givne antal rækker i gruppen, skal du bruge HAVING-udtrykket. Det filtrerer rækker ved hjælp af en tilstandsaggregatfunktion som COUNT. Først i SELECT skal du bruge navnet på en kolonne eller kolonner til at gruppere rækker (dette er en kategori i vores eksempel), og derefter placere den aggregerede funktion COUNT, som stemmer overens med antallet af poster i hver gruppe. For at tælle antallet af rækker, brug id-kolonnen, som gemmer unikke værdier (i vores eksempel bruger vi COUNT(id)
). Brug derefter GROUP BY-sætningen til at gruppere poster i henhold til kolonner (GROUP BY
kategori ovenfor). Efter at have brugt GROUP BY til at filtrere poster med aggregerede funktioner som COUNT, skal du bruge HAVING-udtrykket. Det bruges altid efter GROUP BY-klausulen. I HAVING bruger vi en betingelse til at sammenligne en værdi med en, der returneres af den aggregerede funktion. I eksemplet sammenligner vi om COUNT(id) returnerer en værdi højere end to. Hvis det er sandt, returneres kategorien med produktantallet.