Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z COUNT()
Forum PHP.pl > Forum > Bazy danych > MySQL
bobens_83
Witam. Jak zastosować COUNT() zeby zliczylo ile jest wierszy w tabeli? Patrzalem na manuala ale chyba tego nie rozumiem, bo nie dziala :/
  1. <?php
  2. $db = new mysqli( 'localhost', 'root', '', 'bazka' );
  3. $z_ile = "select count(*) from bazka.tabelka";
  4.  $wynik = $db->query($z_ile);
  5. echo $wynik;
  6. $db->close();
  7. ?>

Rezultatem tegoż skryptu jest pojawienie sie w przegladarce:
Cytat
Object id #2

Aha jeszcze objasnienie:
nazwa bazy: bazka
nazwa tabeli: tabelka
nazwy kolumn: id, osobka

PS. Wiem ze mozna to zrobic inaczej, ale zalezy mi na tym zeby zastosowac COUNT(), poprostu w celach edukacyjnych smile.gif Pozdrawiam.
mhs
  1. <?php
  2. $p = mysql_pconnect('localhost', 'uzytkownik', 'haslo');
  3.  
  4. mysql_select_db('bazaDanych', $p);
  5.  
  6. $w = mysql_query('SELECT COUNT(*) AS ile FROM tabela');
  7.  
  8. $rekord = mysql_fetch_array($w, $p);
  9.  
  10. echo $rekord['ile'];
  11. ?>
Dex1987
Czesc, a jak juz jestesmy przy takim zapytaniu to czy jest taka mozliwosc zeby zliczyc rekordy z jednej tabeli gdzie np id jest rowne jakiejs liczbie, i wyswietlic rekordy z innej tabeli juz bez zadnych warunkow tylko z grupowaniem?

Pozdrawiam dex.
Sh4dow
@mhs jak juz piszesz to zwroc uwage na to ze on chce uzyc mysqli w postaci obiektowej, wiec to co mu brakuje to metoda $obj->fetch_array();
Wiec to czego mu brakuje to
  1. <?php
  2. $db = new mysqli( 'localhost', 'root', '', 'bazka' );
  3. $z_ile = "select count(*) from bazka.tabelka";
  4. $wynik = $db->query($z_ile);
  5. $row = $wynik->fetch_array(MYSQLI_NUM);
  6. echo $row[0];
  7. $db->close();
  8. ?>


Proponuje poczytac manuala php z mysqli jest tam duzo opisanych przykladow.

oczywiscie zamiast zapytania
  1. SELECT count(*)
  2. FROM bazka.tabelka

dal bym
  1. SELECT count(id)
  2. FROM bazka.tabelka

Przy innych typach bazy niz MyISAM jest duzo wydajniejsze

Dex nie do konca rozumiem o co ci chodzi
Jesli chcesz policzyc cos z jakims warunkiem to poprostu robisz warunek to takiego zapytania co jest wyzej. Jesli chodzi o grupowanie to juz nie rozumiem czy ty chcesz polaczyc to razem ?
SongoQ
Cytat
czy jest taka mozliwosc zeby zliczyc rekordy z jednej tabeli gdzie np id jest rowne jakiejs liczbie, i wyswietlic rekordy z innej tabeli juz bez zadnych warunkow tylko z grupowaniem?

GROUP BY dla wszystkich kolumn - nie jest niewydajny.

Mozesz zrobic podzapytanie i dolaczyc do from

Przyklad:
  1. SELECT *
  2. FROM tabela1, (SELECT COUNT(*) AS ilosc, id
  3. FROM tabela2 ..........
  4. .......
  5. )
  6. WHERE tabela1.id = tabela2.id
  7. ....


@Sh4dow Nalezy pamietac ze stowsowanie SELECT COUNT(pole) pomija NULL a COUNT(*) liczy rekordy. Co do wydajnosci to po polo zindeksowanym teoretycznie powinno szybciej dzialac
Sh4dow
Cytat(SongoQ @ 2005-12-06 00:07:16)
Cytat
...
@Sh4dow Nalezy pamietac ze stowsowanie SELECT COUNT(pole) pomija NULL a COUNT(*) liczy rekordy. Co do wydajnosci to po polo zindeksowanym teoretycznie powinno szybciej dzialac

Tak wiem ze jak sobie stworzysz tablice tak bedzie działac. Ale ostatnio spotkalem sie w robocie ze zdaniem ze InnoDB jest duzo wolniejsze naprzyklad przy COUNT(*) i to musze sie zgodzic, jesli takie zapytanie bedzie wykonane na duzej tablicy to to moze trwac nawet parenascie sekund.
Z tym NULL'em nie wiedzialem, ale od czego teoretycznie sa warunki i inne podzapytania czy JOIN'y smile.gif) Zreszta jesli wybierasz jakies pole do zliczania i jest ono indexowane, to nie podejzewam tam wartosci NULL smile.gif

Nie ma rzeczy niemozliwych, tylko zapytanie bedzie bardziej skomplikowane Rkingsmiley.png
SongoQ
Dla InnoDB to wyglada mniej wiecej tak ze rekordy sa liczone w momencie wykonania count(*) to tak jak w Postgresie i dlatego z indexu bedzie szybciej. Kiedys ten temat byl juz na forum odnosnie bazki PG i byly propozycje trigerem trzymania ilosci rekordow w tabeli lub w sekwencji. Wszystko zalezy od ilosci rekordow i zapotrzebowania. Dla InnoDB zalozenia sie zmienily na rzecz relacji i wedlug mnie tak powinno byc, choc nieraz trzeba sie nakombinowac zeby bylo dobrze i szybko.
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.