KategorieBazy danych

[MySQL] Jak policzyć ile produktów należy do danej kategorii ?

Agregacja danych jest niezbędnym elementem w większości projektów z jakimi można się spotkać, czy jest to sklep internetowy pokazujący liczbę produktów w kategoriach czy zwykła lista rekordów pokazująca ich łączną liczbę. W każdym przypadku mamy do czynienia z agregacją danych, która może zostać wykorzystana do różnych celów czy to wyznaczenie maksimum, minimum, średniej czy zwykłego zliczenia rekordów.

Przechodząc jednak do realnego przykładu (został on uproszczony do maksimum), mamy tabelę kategorii, która mniej więcej wygląda w każdym sklepie podobnie.

+-------------+-------------+
| idkategorii | nazwa       |
+-------------+-------------+
|  1          | kategoria 1 |
|  2          | kategoria 2 |
|  3          | kategoria 3 |
+-------------+-------------+

Tabela produktów musi zawierać kolumnę w której będzie przechowywany identyfikator kategorii do których jest przypisany produkt.

+----+-------------+-----------+--------+
| id | idkategorii | nazwa     |   cena |
+----+-------------+-----------+--------+
|  1 |       3     | produkt 1 |  41.00 |
|  2 |       1     | produkt 2 |  26.00 |
|  3 |       1     | produkt 3 |  72.00 |
|  4 |       2     | produkt 4 | 120.00 |
|  5 |       1     | produkt 5 | 127.00 |
|  6 |       2     | produkt 6 |  43.00 |
|  7 |       3     | produkt 7 |   8.00 |
+----+-------------+-----------+--------+

Mając takie dwie tabele chcemy dowiedzieć się ile produktów jest w każdej kategorii, oczekiwany efekt powinien wyglądać jak w tabeli poniżej:

+-------------+-------+
| kategoria   | ilosc |
+-------------+-------+
| kategoria 1 |   3   |
| kategoria 2 |   2   |
| kategoria 3 |   2   |
+-------------+-------+

Zrealizować to zadanie może bardzo proste zapytanie:

SELECT 
    k.nazwa, COUNT(k.idkategorii) AS ilosc 
FROM 
    kategorie AS k 
LEFT JOIN 
    produkty AS p ON k.idkategorii=p.idkategorii 
GROUP BY 
    k.idkategorii

Zapytanie zaprezentowane powyżej realizuje dwie istotne funkcje dla tego zadania. Pierwsze to dołączenie tabeli z produktami do tabeli kategorii, zadanie to zostało zrealizowane z wykorzystaniem złączenia lewostronnego (LEFT JOIN) dzięki któremu w przypadku gdy w kategorii nie ma żadnego produktu nie zostanie ta kategoria usunięta z listy.
Drugie zadanie to po złączeniu tabel należy pogrupować rekordy (GROUP BY) po identyfikatorze kategorii z tabeli kategorii. Dzięki grupowaniu możemy dokonać sumowania wykorzystując funkcję agregującą COUNT.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.