Problem:
Du vill hitta grupper av rader med ett specifikt antal poster i en grupp.
Exempel:
Vår databas har en tabell som heter product
med data i följande kolumner:id
, name
och category
.
id | namn | kategori |
---|---|---|
1 | soffa | möbler |
2 | handskar | kläder |
3 | T-shirt | kläder |
4 | stol | möbler |
5 | skrivbord | möbler |
6 | titta | elektronik |
7 | fåtölj | möbler |
8 | kjol | kläder |
9 | radiomottagare | elektronik |
Låt oss hitta produktkategorin med fler än två poster.
Lösning:
SELECT category, COUNT(id) FROM product GROUP BY category HAVING COUNT(id)>2;
Här är resultaten:
kategori | räkna |
---|---|
möbler | 4 |
kläder | 3 |
Diskussion:
För att filtrera poster enligt det givna antalet rader i gruppen, använd HAVING-satsen. Den filtrerar rader med en aggregatfunktion som COUNT. Använd först i SELECT namnet på en kolumn eller kolumner för att gruppera rader (detta är en kategori i vårt exempel), placera sedan den aggregerade funktionen COUNT, som motsvarar antalet poster i varje grupp. För att räkna antalet rader, använd id-kolumnen som lagrar unika värden (i vårt exempel använder vi COUNT(id)
). Använd sedan GROUP BY-satsen för att gruppera poster enligt kolumner (GROUP BY
kategori ovan). Efter att ha använt GROUP BY för att filtrera poster med aggregerade funktioner som COUNT, använd HAVING-satsen. Den används alltid efter GROUP BY-satsen. I HAVING använder vi ett villkor för att jämföra ett värde med ett som returneras av den aggregerade funktionen. I exemplet jämför vi om COUNT(id) returnerar ett värde högre än två. Om det är sant, returneras kategorin med produktantalet.