Często pojawi się moment w którym poczujemy potrzebę zgrupowania rekordów, np. w celu wykonania obliczeń ich ilości w bazie.
Zacznijmy od prostego zliczenia wszystkich rekordów z tabeli „games„
SELECT count(`id`) as quantity FROM `games`
quantity |
6 |
Powyżej, w celu zliczenia ilości rekordów, posłużyła nam funkcja „count()„. Jako argument przekazaliśmy nazwę kolumny.
My natomiast chcemy pogrupować rekordy według platformy a następnie je zliczyć. Do grupowania rekordów posłuży nam poniższy wzór
SELECT {kolumna} FROM {tabela} GROUP BY {kolumna}
Zliczmy teraz ilość gier z podziałem na platformy:
SELECT count(`id`) as quantity, `platform` FROM `games` group by `platform`;
quantity | platform |
1 | null |
4 | pc |
1 | psx |
Najpierw zadeklarowaliśmy zliczenie rekordów podobnie jak w poprzednim przykładzie. Następnie pogrupowaliśmy wynik na platformy. Wynikiem zapytania są 3 rekordy, jedna gra nie ma zadeklarowanej platformy. Na platformie „pc” posiadamy 4 gry, oraz jedną na platformę „psx„
Dodajmy do powyższej tabeli wyników informacje które tytuły gier znajdują się na daną platformę:
SELECT count(`id`), `platform`, GROUP_CONCAT(`title`) as titles FROM `games` group by `platform`;
quantity | platform | titles |
1 | null | Magia i miecz |
4 | pc | GTA4,CSGO,Super Mario,Diablo |
1 | psx | THPS2 |
Kolejnym naszym krokiem będzie wyeliminowanie wierszy w których platforma jest nieznana:
SELECT count(`id`), `platform`, GROUP_CONCAT(`title`) as titles FROM `games` group by `platform` HAVING `platform` is not null;
quantity | platform | titles |
4 | pc | GTA4,CSGO,Super Mario,Diablo |
1 | psx | THPS2 |
Użyliśmy w tym celu funkcji „having” która działa podobnie jak funkcja „where” natomiast warunki logiczne tyczą się całych grup, a nie pojedynczych rekordów.