Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Ile rekordów ma kwerenda
michcioh
post 31.03.2007, 12:21:23
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 31.03.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Indeo
post 1.04.2007, 10:02:43
Post #2





Grupa: Zarejestrowani
Postów: 295
Pomógł: 7
Dołączył: 26.03.2004
Skąd: Opole

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
michcioh
post 1.04.2007, 14:19:31
Post #3





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 31.03.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Norbas
post 1.04.2007, 23:00:48
Post #4





Grupa: Zarejestrowani
Postów: 100
Pomógł: 1
Dołączył: 6.02.2006

Ostrzeżenie: (0%)
-----


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)


--------------------
Go to the top of the page
+Quote Post
michcioh
post 2.04.2007, 13:16:23
Post #5





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 31.03.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 8.07.2025 - 03:39