Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [mysql] Funkcja Select Count (*), Szukam pomocy
Watexon
post 5.04.2006, 18:32:36
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 5.04.2006

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


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!
Go to the top of the page
+Quote Post
Fipaj
post 5.04.2006, 18:35:30
Post #2





Grupa: Zarejestrowani
Postów: 691
Pomógł: 0
Dołączył: 19.01.2005
Skąd: Warszawa

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


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...?


--------------------
Go to the top of the page
+Quote Post
Watexon
post 5.04.2006, 18:52:01
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 5.04.2006

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


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.
Go to the top of the page
+Quote Post
-Guest-
post 5.04.2006, 20:38:41
Post #4





Goście







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
Go to the top of the page
+Quote Post
dr_bonzo
post 5.04.2006, 20:50:06
Post #5





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


OMG:

  1. SELECT imie, COUNT( imie ) ilosc
  2. FROM osoby
  3. GROUP BY imie;


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Watexon
post 6.04.2006, 07:54:08
Post #6





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 5.04.2006

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


Gest!!!!!!! Jesteś wielki biggrin.gif takiego banana mam już z samego rana. Działa aż miło. Jeszcze raz wielkie dzięki.
Go to the top of the page
+Quote Post
anita
post 11.02.2007, 01:21:25
Post #7





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 11.02.2007

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


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. ?>
Go to the top of the page
+Quote Post
SongoQ
post 11.02.2007, 05:35:05
Post #8





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


@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.


--------------------
Go to the top of the page
+Quote Post
anita
post 11.02.2007, 17:24:54
Post #9





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 11.02.2007

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


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?

Ten post edytował anita 11.02.2007, 17:25:59
Go to the top of the page
+Quote Post
DjKermit
post 11.02.2007, 17:31:48
Post #10





Grupa: Zarejestrowani
Postów: 82
Pomógł: 0
Dołączył: 18.06.2005

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


Użyć
  1. <?php
  2. mysql_data_seek($wyniq, 0);
  3. ?>

i przelecieć pętlą jeszcze raz


--------------------
emiker
Go to the top of the page
+Quote Post
SongoQ
post 11.02.2007, 20:01:17
Post #11





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


Najlatwiej 2 zapytania. No chyba ze otrzymujesz rekordy i wtedy 2x petle robic.


--------------------
Go to the top of the page
+Quote Post
anita
post 11.02.2007, 20:01:41
Post #12





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 11.02.2007

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


@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?

Ten post edytował anita 11.02.2007, 20:05:07
Go to the top of the page
+Quote Post
SongoQ
post 11.02.2007, 20:17:09
Post #13





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


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.


--------------------
Go to the top of the page
+Quote Post
anita
post 11.02.2007, 21:32:13
Post #14





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 11.02.2007

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


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)
Go to the top of the page
+Quote Post
SongoQ
post 12.02.2007, 01:54:29
Post #15





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


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


--------------------
Go to the top of the page
+Quote Post
maryaan
post 12.02.2007, 11:04:32
Post #16





Grupa: Zarejestrowani
Postów: 380
Pomógł: 2
Dołączył: 5.01.2007

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


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.


--------------------
Wybierasz się do Zakopanego? Odwiedź Willę Pod Górami. Następnym razem na pewno do niej wrócisz :)
Go to the top of the page
+Quote Post
yaotzin
post 12.02.2007, 21:44:53
Post #17





Grupa: Zarejestrowani
Postów: 157
Pomógł: 0
Dołączył: 12.02.2007
Skąd: Zielona Góra

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


  1. SELECT count(*) FROM tabela GROUP BY imiona


Powyższe nie zadziała questionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gifquestionmark.gif?


--------------------
------
Per Aspera Ad Astra
Go to the top of the page
+Quote Post
buliyo
post 8.07.2008, 18:58:25
Post #18





Grupa: Zarejestrowani
Postów: 82
Pomógł: 0
Dołączył: 9.01.2006

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


  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
Go to the top of the page
+Quote Post
webdice
post 8.07.2008, 19:13:13
Post #19


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




  1. SELECT `imie`, COUNT(imie) AS `ilosc` FROM `osoby` GROUP BY `imie` ORDER BY `ilosc`;
Go to the top of the page
+Quote Post
buliyo
post 8.07.2008, 20:13:15
Post #20





Grupa: Zarejestrowani
Postów: 82
Pomógł: 0
Dołączył: 9.01.2006

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


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

2 Stron V   1 2 >
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: 27.04.2025 - 06:12