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.