Zliczanie ilości wpisów

0

Witam

Mam stworzone dwie tabele w bazie:

idkategorii nazwa
1 kategoria 1
2 kategoria 2
3 kategoria 3

oraz

id idkategorii nazwa cena
1 1 produkt 1 10
2 1 produkt 2 23
3 1 produkt 3 231
4 2 produkt 4 543
5 1 produkt 5 21
6 2 produkt 6 12
7 1 produkt 7 122

Chciałbym zliczyć ile razy dane id kategorii z pierwszej tabeli występuje w drugiej. Robię coś takiego:

$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";
$wynik = mysql_query($zapytanie);
while ($wiersz = mysql_fetch_array($wynik, MYSQL_ASSOC))
{

        echo $wiersz['nazwa']." wystepuje ".$wiersz['ilosc']." razy.";
}

Prawie wszystko działa jak należy, tzn. w wyniku dostaję, że kategoria 1 występuje 5 razy, kategoria 2 dwa razy ale problem pojawia się w momencie pokazywania ilości wystąpień kategorii 3. Pokazuje mi, że kategoria 3 występuje 1 raz chociaż powinno być 0.
Gdzie robię błąd?
Jak zrobić, żeby w przypadku nie występowania danej kategorii liczba jej wystąpień była wyświetlana jako 0?
Pozdrawiam

0
select idkategorii, count(*) as ilosc from produkty group by idkategorii
union
select idkategorii, 0 as ilosc from kategorie k 
where not exists (select * from produkty p where k.idkategorii = p.idkategorii)

albo coś takiego - pójdzie na mssql, na mysql też powinno:

select idkategorii, (select count(*) from produkty p where p.idkategorii = k.idkategorii) as ilosc
from kategorie k

wiesz jak działa left join? jeśli nie ma pasującego rekordu, to na jego miejsce ląduje rekord wypełniony nullami. dlatego count zwraca 1 dla kategorii obecnych tylko w jednej tabeli. Twoje zapytanie poprawione będzie wyglądać mniej-więcej tak (pisane z palca, nie mam i nie używam mysql, ale nawet jeśli nie zadziała, to zobacz jaki jest pomysł na to zapytanie):

SELECT 
  k.idkategorii, 
  case p.idkategorii is null when false then COUNT(p.idkategorii) else 0 end case AS ilosc 
FROM kategorie AS k
LEFT JOIN produkty AS p ON k.idkategorii = p.idkategorii 
GROUP BY k.idkategorii
0

Zamień

COUNT(k.idkategorii) AS ilosc 

na COUNT(p.idkategorii) AS ilosc

0

Po zmianie k.idkategorii na p.idkategorii zlicza poprawnie.
Będę musiał potestować na większej liczbie danych ale na pierwszy rzut oka teraz jest wszystko ok.
Dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0