Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zliczanie grup w danej kategorii
Forum PHP.pl > Forum > Bazy danych > MySQL
sf
Witam, mam o to takie 3 tabele :
  1. -- sfg_categories - podział na kategorie (jedno warstwowy), w ktorych trzymamy obrazki
  2. -- nr kategorii, nazwa, prawa autorskie do obrazkow z tej grupy
  3.  
  4. CREATE TABLE sfg_categories (
  5. cid SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT UNIQUE NOT NULL,
  6. cname VARCHAR(255) NOT NULL,
  7. ccopyrights VARCHAR(255) NOT NULL DEFAULT ''
  8. );
  9.  
  10. -- sfg_pictures - kazdy obrazek ma swoj numer
  11. -- nr obrazka, nr kategorii, nr grupy, szerokosc, wysokosc obrazka
  12.  
  13. CREATE TABLE sfg_pictures (
  14. pid SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT UNIQUE NOT NULL,
  15. pcid SMALLINT UNSIGNED NOT NULL,
  16. pgid SMALLINT UNSIGNED NOT NULL, -- te same obrazki, ale w roznej rozdzielczosci maja ten sam numer
  17. psizex SMALLINT UNSIGNED NOT NULL, -- szerokosc
  18. psizey SMALLINT UNSIGNED NOT NULL -- wysokosc
  19.  
  20. );
  21.  
  22. -- sfg_groups - grupy tworza obrazki, ktore maja ten sam obrazek, ale w roznej rozdzielczosci
  23. -- nr grupy, data utworzenia grupy, typ/rozszezenie pliku, opis grupy
  24.  
  25. CREATE TABLE sfg_groups (
  26. gid SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT UNIQUE NOT NULL,
  27. gdate TIMESTAMP NOT NULL, -- dodawana automatycznie
  28. gtype VARCHAR(6) NOT NULL DEFAULT 'jpg', -- typ pliku
  29. gdesc VARCHAR(255) NOT NULL DEFAULT 'brak opisu' -- opis co przedstawia obrazek
  30. );

Chciałbym teraz uzyskać zapytanie, które zwróci mi ilość grup w poszczególnych kategoriach. Próbowałem w ten sposób:
  1. SELECT cid, cname, count(*) AS ng
  2. FROM sfg_categories, sfg_pictures WHERE pcid = cid GROUP BY cid, cname ORDER BY cname ASC

Niestety zlicza dodatkowo rozdzielczości. Czyli jeżeli grupa zawiera obrazek w rozdzielczości 800x600 i 1024x768 to liczy jako 2 pozycje, a powinno jako jedną.
Zastanawiam się także czy może nie lepszym rozwiązaniem byłoby przeniesienie pcid (nr kategorii) z sfg_pictures do sfg_groups. Wtedy chyba powinno się dać łatwo stworzyć zapytanie do policzenia, ale nie wiem czy nie spwoduje to problemów z innymi zapytaniami :-/. Gubie się jak chodzi o SQL bo mój mózg nie umie tego wszystkiego naraz pojąć ;] Eksperymentowanie natomiast zajmuje bardzo dużo czasu. Yh.
popbart
Cytat
  1. SELECT cid, cname, count(*) AS ng
  2.  
  3. FROM sfg_categories, sfg_pictures
  4. WHERE pcid = cid GROUP BY cid, cname ORDER BY cname ASC

Niestety zlicza dodatkowo rozdzielczości


Moze tak:
  1. SELECT pcid AS kategoria, count( pgid) AS ilosc_grup
  2. FROM sfg_pictures GROUP BY pcid

A z relacjami to juz sobie poradzisz smile.gif (pamiętaj tylko żeby używać tabela.pole) winksmiley.jpg

Jeszcze pytanko, czy grupa nie powinna być połączona relacją z kategorią?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.