Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] Funkcja Select Count (*)
Forum PHP.pl > Forum > Przedszkole
Watexon
Mam taką tabelę "osoby" a w niej "imiona":
Jan
Jan
Maria
Maria
Maria
Rokita

chcę policzyć rekordy żeby wynik na stronie wyświetlał się w formacie:
Jan: 2
Maria: 3
Rokita: 1

Nie mam pojęcie jak za pomocą funkcji SELECT COUNT(*)imiona FROM osoby wycągnąć wszystkie te rekordy za jednym razem przy pomocy jednego skryptu. Nie wiem na pewno bo się uczę ale chyba to trzeba zrobić w jakiejś pętli. Byłbym wdzięczny za przykłady.
Ps. Cały dzień już się z tym męczę. Please HELP!
Fipaj
o ile się nie mylę, za pomocą zwykłego select count tego nie zrobisz. możesz oczywiście wykonywać select count dla każdego imienia, ale to będzie wydajnościowa bomba.

ja sobie myślę tak:
1. pobierasz wszystkie rekordy
2. bierzesz je w pętlę
3. tworzysz tablicę $imiona
4.1. jeśli $imiona[$imie] istnieje (i jest liczbą), inkrementujesz.
4.2. jeśli nie istnieje, tworzysz ją i ustawiasz wartość na jeden
5. wyświetlasz

ok...?
Watexon
Dzięki za wskazówki Fipaj. To jest tak jak myślałem że funkcja SELECT nie jest do tego najlepsza. Niestey mówiąc że jestem początkujący miałem na myśli na prawdę początkujący. Tzn chyba gorzej niż przedszkolak bo nawet nie bardzo wiem jak to wszystko co mi napisałeś zrobić. Niestety wszędzie szukam wiadomości i w internecie i w książkach ale nie potrafię ruszyć. Może znasz jakieś dobre źródło gdzie mógłbym taki przykład znaleźć. Tzn jego rozwiązanie.
Ale wielkie dzięki jakiś kierunek myśloy jest.
Guest
w tagach php tongue.gif
  1. <?
  2. $tab = Array();
  3.  
  4. // wykonanie zapytania i...
  5.  
  6. $q = "SELECT imiona FROM osoby";
  7. $q = mysql_query($q);
  8.  
  9. // ...utworzenie tablicy
  10.  
  11. if (mysql_num_rows($q) > 0)
  12.     while ($r = mysql_fetch_array($q))
  13.         $tab[$r[0]] += 1;
  14.  
  15. // wypisanie danych
  16.  
  17. foreach($tab as $index => $wartosc)
  18.     echo $index.": ".$wartosc."<br>\n";
  19. ?>


----------
Usunalem twoj post bez tagow.
Bylo tam dopisane:
Cytat
nie testowalem ale powinno dzialac

--
dr_bonzo
dr_bonzo
OMG:

  1. SELECT imie, COUNT( imie ) ilosc
  2. FROM osoby
  3. GROUP BY imie;
Watexon
Gest!!!!!!! Jesteś wielki biggrin.gif takiego banana mam już z samego rana. Działa aż miło. Jeszcze raz wielkie dzięki.
anita
Cytat(dr_bonzo @ 5.04.2006, 20:50:06 ) *
OMG:
  1. SELECT imie, COUNT( imie ) ilosc
  2. FROM osoby GROUP BY imie;

O ile zliczanie wg. jednej kolumny jest dla mnie jasne to jak (zakładając, że mamy kolumnę nazwisko) zrobić w jednym zapytaniu zliczanie jeszcze nazwiska? Podobno coś można wykombinować z UNION, ale jak później wyciągnąć dane?
Załóżmy, że mam:
  1. <?php
  2. $wyniq = sql_select_my('SELECT imie,COUNT(id) FROM osoby WHERE $zapytanie GROUP BY imie UNION SELECT nazwisko,COUNT(id) FROM osoby WHERE $zapytanie GROUP BY nazwisko');
  3. while($row2 = mysql_fetch_array($wyniq)){
  4.  $ilosc_osob=$row2[count(id)]; 
  5.  /* jak wyciagnac z tego nazwiska - zapytanie sql moze nie byc dobre! */
  6. }
  7. ?>
SongoQ
@Watexon Spoko wedlug Ciebie najlepszy sposob a wedlug mnie nie ma nic gorszego od tego przykladu. No ale mysle ze dojdziesz dlaczego.

@anita Jesli stosujesz UNION to musisz sobie oflagowac rekordy ktory jest imie a ktory nazwisko.

czyli cos takiego:

  1. SELECT imie, 'imie' AS typ_rekordu FROM ............ UNION
  2. SELECT nazwisko, 'nazwisko' AS typ_rekordu FROM ..............


Pole imie i nazwisko musza byc tego samego typu. A wyciaganie juz jest standardowe sprawdzasz wartosc w polu typ_rekordu.
anita
Cytat(SongoQ @ 11.02.2007, 05:35:05 ) *
@anita Jesli stosujesz UNION to musisz sobie oflagowac rekordy ktory jest imie a ktory nazwisko.
  1. SELECT imie, 'imie' AS typ_rekordu FROM ............ UNION
  2. SELECT nazwisko, 'nazwisko' AS typ_rekordu FROM ..............

Pole imie i nazwisko musza byc tego samego typu. A wyciaganie juz jest standardowe sprawdzasz wartosc w polu typ_rekordu.

Do tego doszłam smile.gif i o ile mogę wyświetlać jedno (bo drugie nie wychodzi) to jak zrobić wyświetlenie dwóch list, np.:
Arek 4
Wojtek 2
Marcin 1
Agata 0

i niżej:

Kowalski 4
Nowak 2
Jędrzejczak 1
Borowczyk 0

w poniższym kodzie mam jedną pętle, która wywołuje zapytanie i mam wyświetlone imiona oraz obok liczniki...
  1. <?php
  2. while($row2 = mysql_fetch_array($wyniq)){
  3.  echo $row2[imie].': '.$row2[imiona].'<BR>'; // np. Wojtek: 2
  4. }
  5. ?>

...jednak co mam zrobić, żeby ponownie zrobić pętle nie wywołując zapytania i wyświetlić nazwiska?
DjKermit
Użyć
  1. <?php
  2. mysql_data_seek($wyniq, 0);
  3. ?>

i przelecieć pętlą jeszcze raz
SongoQ
Najlatwiej 2 zapytania. No chyba ze otrzymujesz rekordy i wtedy 2x petle robic.
anita
@SongoQ: Chodzi tutaj o kilka tysięcy rekordów, a na dodatek potrzebuję oprócz nazwiska i imion również innych właściwości, więc tworzenie kilkunastu zapytań chyba nie jest najlepszym rozwiązaniem.
Teoretycznie zapytanie przetwarzające 50000 rekordów nie trwa długo, więc nie wiem czy jednak nie skłonić się do kilku zapytań.

@DjKermit:
Wywołując następujące zapytanie
  1. SELECT imie,COUNT(id) AS imie FROM ogloszenia WHERE id>'0' GROUP BY imie
  2. UNION ALL
  3. SELECT nazwisko,COUNT(id) AS nazwisko FROM ogloszenia WHERE id>'0' GROUP BY nazwisko ORDER BY 2 DESC

otrzymuję (phpmyadmin) naprzemienną listę nazwisk i imion:
Kowalski: 8
Nowak: 5
Wojtek: 4
Ania: 2

Chcąc zrobić drugą listę (tylko nazwiska) wg.
  1. <?php
  2. mysql_data_seek($wynikq, 0);
  3. while($row2 = mysql_fetch_array($wynikq)){
  4.  $qnazwisko=$row2['nazwisko'];
  5.  echo $qnazwisko.': '.$liczban[$qnazwisko].'<br />'; //ex. Kowalski: 8
  6. }
  7. ?>

nic nie dostaje, chociaż powinno być ok, bo gdy wywołuję w ten sam sposób imiona (w pierwszej pętli) jest wszystko OK.
Przypomnę, że chcę osiągnąć wynik w formie:
Kowalski: 8
Nowak: 5
Zaporowska: 2
-------- a następnie imiona
Wojtek: 4
Ania: 2
Krzysztof: 1

Czy UNION to jest dobre rozwiązanie?
SongoQ
Cytat
więc tworzenie kilkunastu zapytań chyba nie jest najlepszym rozwiązaniem.

Zgadzam sie.

To moze tak jak pisalem wczesniej zrob to w petli. Wyciagasz imiona i nazwiska w jako UNION a nastepnie w 2 petlach sobie rozdzialach wedlug typu nazwisko i imie itd.
anita
Cytat(SongoQ @ 11.02.2007, 20:17:09 ) *
Zgadzam sie.

To moze tak jak pisalem wczesniej zrob to w petli. Wyciagasz imiona i nazwiska w jako UNION a nastepnie w 2 petlach sobie rozdzialach wedlug typu nazwisko i imie itd.

Przekonałam się, że UNION jako łączenie zapytań nic nie wskóra, bo w wynikach zawsze dostanę tylko 2 kolumny gdzie w pierwszej jest Nazwa, a w drugiej Count(), a w żaden sposób nie rozróżnię imion od nazwisk, by później je umieścić w różnych pętlach.

Ciekawi mnie jak wygląda zapytanie sql na Amazon.com gdzie widzimy w kategorii coś takiego:
Narrow by Category
Media Center (47)
Thin & Light (35)

Narrow by Brand
Hewlett-Packard (1363)
Fujitsu Siemens Computers (1359)
Lenovo (879)

Narrow by Seller
PAC Computers (563)
Computer Brain (277)
ANTOnline (277)
SongoQ
Odnosnie przykadu to podejrzewam ze sa 2 zapytania 1 to typ a 2 to produkty.

Odnosnie UNION to mozna tak zrobic

  1. SELECT pole_imie AS 'wartosc', count(*) AS ilosc, 'imie' AS typ FROM ......... UNION
  2. SELECT pole_nazwisko AS 'wartosc', count(*) AS ilosc, 'nazwisko' AS typ FROM .........


Jak wyciagasz dane:

  1. <?php
  2. if($aRecord['typ'] == 'imie')
  3. $aImie[] = $aRecord;
  4. else
  5. $aNazwisko[] = $aRecord;
  6. ?>


W jednej tablicy masz imiona a w 2 nazwiska
maryaan
w tabeli jest 250 000 rekordow w ukladzie
id | jakisHash

rekordy zliczamy wg ciagu pierwszy + ostatni znak hasha, wersja ktora proponujecie z php, czyli w petli mamy:
  1. <?php
  2. $ret[substr($l['hash'], 0, 1).substr($l['hash'], 31,1)]++;
  3. ?>
wykonuje sie nieco powyzej 1,5 sekundy, to samo tylko wykonane jeszcze na bazie mysql:
  1. SELECT hash, count(*) FROM hash GROUP BY concat(substr(hash, 1,1), substr(hash, 32,1));
wykonuje sie ok 0.5 sekundy, przy wiekszej liczbie zapytan roznica w czasie wykonywania skryptu bedzie wynosila kilka sekund na niekorzysc php.
Najprosciej zrobic sobie w ten sposob testy wydajnosciowe, wystarczy napisac dwa skrypty ktore robia to samo, z tym ze jeden przetwarza dane dopiero w php a drugi juz na etapie pobierania danych z bazy.
yaotzin
  1. SELECT count(*) FROM tabela GROUP BY imiona


Powyższe nie zadziała questionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gif?
buliyo
  1. <?
  2. $tab = Array();
  3.  
  4. // wykonanie zapytania i...
  5.  
  6. $q = "SELECT imiona FROM osoby";
  7. $q = mysql_query($q);
  8.  
  9. // ...utworzenie tablicy
  10.  
  11. if (mysql_num_rows($q) > 0)
  12. while ($r = mysql_fetch_array($q))
  13. $tab[$r[0]] += 1;
  14.  
  15. // wypisanie danych
  16.  
  17. foreach($tab as $index => $wartosc)
  18. echo $index.": ".$wartosc."<br>\n";
  19. ?>

a jak to posortowac wg ilosci imion..?
np.
Marek : 4
Jurek : 2
Monika :1
Piotr : 1
  1. <?
  2. $tab = Array();
  3.  
  4. // wykonanie zapytania i...
  5.  
  6. $q = "SELECT imiona FROM osoby";
  7. $q = mysql_query($q);
  8.  
  9. // ...utworzenie tablicy
  10.  
  11. if (mysql_num_rows($q) > 0)
  12. while ($r = mysql_fetch_array($q))
  13. $tab[$r[0]] += 1;
  14.  
  15. // wypisanie danych
  16. sort($tab);
  17. foreach($tab as $index => $wartosc)
  18. echo $index.": ".$wartosc."<br>\n";
  19. ?>

sortuje ale.. gina indexy z imionami..
0:3
1:3
2:2
3:1
4:1
webdice
  1. SELECT `imie`, COUNT(imie) AS `ilosc` FROM `osoby` GROUP BY `imie` ORDER BY `ilosc`;
buliyo
tylko ze w tym wypadku mamy jedna kolumne.. kod ma za zadanie obliczyc ile razy jest dany wpis.. w kolumnie i te zliczone rekordy z przypisanymi liczbami na posortowac..
allek
Cytat(buliyo @ 8.07.2008, 21:13:15 ) *
tylko ze w tym wypadku mamy jedna kolumne.. kod ma za zadanie obliczyc ile razy jest dany wpis.. w kolumnie i te zliczone rekordy z przypisanymi liczbami na posortowac..


blinksmiley.gif nie bardzo rozumiem o co Ci teraz chodzi...
powyższe zapytanie zwraca Ci dwie kolumny: imie i ilosc (ilość krotek o takiej samej wartości kolumny imie) posortowane według ilosci.
neptus
Jak taki licznik wstawić do drugiej bazy? Np. mam bazę A z imionami i nazwiskami, a w bazie B mam pole imię i licznik występowania tego imienia w bazie A. Jak powstawiać w rekordach bazy B liczniki dla właściwego imienia?
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.