Rozdział 7: Grupowanie rekordów

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`;
quantityplatform
1null
4pc
1psx

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`;
quantityplatformtitles
1nullMagia i miecz
4pcGTA4,CSGO,Super Mario,Diablo
1psxTHPS2

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;
quantityplatformtitles
4pcGTA4,CSGO,Super Mario,Diablo
1psxTHPS2

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.