Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ile rekordów ma kwerenda
Forum PHP.pl > Forum > Bazy danych > MySQL
michcioh
Witam!

Jestem na wymianie studenckiej, wykonuje projekt w Javie, ktory laczy sie z baza MySQL. Mam dwie tabele w mojej baze danych:

  1. CREATE TABLE categories (
  2. id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
  3. name text NOT NULL
  4. );
  5.  
  6. CREATE TABLE products (
  7. id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
  8. id_categories int NOT NULL,
  9. name text NOT NULL,
  10. amount int NOT NULL,
  11. description text NOT NULL,
  12. FOREIGN KEY(id_categories) REFERENCES categories(id)
  13. );


Potrzebuje wyswietlic ilosc rekordow z kwerendy, ktora wyswietla, jakie kategorie maja conajmniej jeden produkt. Innymi slowy ile jest takich kategorii, ktore maja conajmniej jeden produkt.
Wpomniana kwerende udalo mi sie sklecic w ten sposob:
  1. SELECT categories.name AS name FROM categories, products WHERE ( SELECT count(products.id) FROM products) >0 AND categories.id =products.id_categories GROUP BY name;


Czy ktos moze mi podpowiedziec jak teraz zliczyc, ile jest tych kategorii? smile.gif Jesli nie znajde rozwiazania bede musial wykonac to w inny sposob, od strony programistycznej duzo toporniejszy, a chcialbym tego uniknac smile.gif

pozdrawiam
michcio
Indeo
Rozumiem, że chodzi Ci o to ile jest kategorii "aktywnych" czyli takich dla których obecnie są produkty a nie liczbę wszystkich kategorii.

Nie potrzeba do tego warunków WHERE - samo sprzężenie INNER wymusza integralność.
To zapytanie zwraca listę nazw kategorii dla których istnieją produkty (z tej kategorii):

  1. SELECT categories.name AS name FROM categories INNER JOIN products
  2. ON categories.id =products.id_categories
  3. GROUP BY name;


Natomiast ilość zwróconych rekordów można przechwycić np w php funkcją mysql_affected_rows().
W "C" działa to chyba podobnie - link
. Zawsze można zapytać osobno o ilość takich wierszy:
  1. SELECT count(categories.id) AS N FROM categories INNER JOIN products
  2. ON categories.id =products.id_categories
  3. ;


Nie wiem czy to o to chodziło winksmiley.jpg
michcioh
Niestety dalej nie znam odpowiedzi na moje pytanie . To co napisales w pierwszym zapytaniu zwraca taki sam wynik jak moje zapytanie, ale dziekuje za byc moze bardziej poprawne rozwiazanie.
Jednak meritum tego posta dalej nie jest rozwiazane. Dalej nie wiem, jak zliczyc kategorie, ktore maja conajmniej jeden produkt, poniewaz Twoje drugie zapytanie nie dziala taka jak trzeba. Zwraca mi kolumne N z wierszem "2" mimo, ze poprzednie zapytanie wyrzuca tylko jeden wynik. Krotko mowiac, nie dziala tak jak powinno smile.gif

Prosze o dalsze propozycje, to nie moze byc az takie trudne :/

pozdrawiam
michcioh


Cytat(Indeo @ 1.04.2007, 12:02:43 ) *
Rozumiem, że chodzi Ci o to ile jest kategorii "aktywnych" czyli takich dla których obecnie są produkty a nie liczbę wszystkich kategorii.

Nie potrzeba do tego warunków WHERE - samo sprzężenie INNER wymusza integralność.
To zapytanie zwraca listę nazw kategorii dla których istnieją produkty (z tej kategorii):

  1. SELECT categories.name AS name FROM categories INNER JOIN products
  2. ON categories.id =products.id_categories
  3. GROUP BY name;


Natomiast ilość zwróconych rekordów można przechwycić np w php funkcją mysql_affected_rows().
W "C" działa to chyba podobnie - link
. Zawsze można zapytać osobno o ilość takich wierszy:
  1. SELECT count(categories.id) AS N FROM categories INNER JOIN products
  2. ON categories.id =products.id_categories
  3. ;


Nie wiem czy to o to chodziło winksmiley.jpg
Norbas
Może tak:
  1. SELECT COUNT(categories.id)
  2. FROM categories WHERE id IN (
  3. SELECT categories.id
  4. FROM categories LEFT JOIN products ON categories.id=products.id_categories
  5. GROUP BY categories.id
  6. HAVING COUNT(products.id)>0)
michcioh
Cytat(Norbas @ 2.04.2007, 01:00:48 ) *
Może tak:
  1. SELECT COUNT(categories.id)
  2. FROM categories WHERE id IN (
  3. SELECT categories.id
  4. FROM categories LEFT JOIN products ON categories.id=products.id_categories
  5. GROUP BY categories.id
  6. HAVING COUNT(products.id)>0)


dziekuje, dziala smile.gif

Moj kumpel z wymiany studenckiej zaproponowal jeszcze inne dobre rozwiazanie:
  1. SELECT count(DISTINCT categories.id) FROM categories, products WHERE categories.id = products.id_categories;

Ale w zyciu nie widzialem distinct w funkcji count. Mysle ze warto pokazywac takie rozwiazania takze smile.gif

dziekuje jeszcze raz i pozdrawiam smile.gif
michcioh
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.