Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] policzenie ilosci rekordow?
Forum PHP.pl > Forum > PHP
AndyPSV
tak se myslalem

chodzi o to, ze mam tabele, niech bedzie REKORDY
w tabeli tej, mam dane o kategoriach

ID T C0 C1
1 moj_tytul 1/10 2/20

teraz, chce wyciagnac wszystkie rekordy, ktore maja T LIKE "%zmienna%"

jak teraz w tym momencie policzyc wszystkie rekordy; musze pobrac kazdy rekord, zsumowac ich ilosc, a nastepnie pobrac nazwe KATEGORII z oddzielnej tabeli czy jak to zrobic?

jak to jest zrobione na allegro albo ebayu?
nie wywali sie baza jak bedzie np. 1 mln rekordow?
jak to rozwiazac?
Zyx
Ale chodzi Ci o liczbę wierszy w całej bazie spełniającej ten warunek czy liczbę zwróconych w zbiorze wyników? Jeśli używasz stronicowania, a zakładam, że używasz, te wartości mogą być różne. Do zbioru wyników funkcję masz wyżej, do liczenia ogólnego musisz wysłać dodatkowe zapytanie korzystające z SQL-owej funkcji COUNT(). Jednak, jak słusznie zauważyłeś, liczenie w locie wszystkiego może być dość czasochłonne przy dużej bazie, dlatego często stosuje się optymalizacje polegające np. na zapisywaniu liczników bezpośrednio w polach wierszy. Niestety, jeśli chcesz korzystać z LIKE, wtedy takiego licznika nie wygenerujesz, bo musiałbyś trzymać jego wartości dla wszystkich możliwych ciągów, co nie wchodzi w grę smile.gif. Dlatego jedyna sensowna opcja dla Ciebie to skorzystanie z COUNT().

thek
Różnie ludzie oceniają skuteczność SQL_CALC_FOUND_ROWS, gdyż niektórzy twierdzą, że nie używa indeksów ( z LIKE to i tak traci znaczenie ), ale w tym wypadku mogło by się to sprawdzić.
waqmaz
pokaze ci to na przykladzie wyszukiwania w tabeli rekordow i przekazywania do pliku.php smile.gif
stworz sobie i textbox z wyrazeniem 'wyrazenie'.

  1. $zapytanie = "select * from tabela like '%".$wyrazenie."%'"; (tutaj moglem sie walnac bo niepamietam jak to dokladnie sie wybieralo z tym %) ; ) poradzisz sobie.
  2. $wynik = $db->query($zapytanie);
  3. $znalezionych = $wynik->num_rows;
  4. echo "<p>Ile znalazlo sie: ".$znalezionych."</p>";
  5.  
  6. for ($i=0; $i <znalezionych; $i++) {
  7. $wiersz = $wynik->fetch_assoc();
  8. ..wyswietlenie..z tablica.. np:
  9. echo "<p>".($i+1).". Tytuł: " . "</p>";
  10. }


czyli jak widzisz $wynik->num_rows; wskazuje na wiersze mozna w ten sposob sprawdzic czy juz cos istnieje i wystawic errora ze nie mozna dodac czegos o takiej samie nazwie bo taki numrows juz jest ;p np. w rejestarcji o heh haha.gif
thek
Taaa waqmaz... I pobranie z bazy miliona rekordów, by sobie to potem php policzył PO przesłaniu tych milionów jest super wydajne winksmiley.jpg Nawet localhost może się wysypać z pamięcią jeśli to będą duże tabele. Albo count(klucz_primary) albo SQL_CALC_FOUND_ROWS bo każda inna wersja odwali taką jazdę, że głowa Cię rozboli. Na chłopski rozum... Mieszkasz w Polsce i chcesz wiedzieć ile słoni jest w Afryce. Ściągasz je wszystkie do Polski i liczysz, czy każesz sobie przesłać od razu ich liczbę? Twój kod waqmaz każe zrobić to pierwsze biggrin.gif

AndyPSV... Tabela produktów JOIN z tabelą kategorii (może być poprzez tabelę złączeniową ) z warunkiem where i group by po id kategorii. Do tego w select robisz count(id_produktu). Ale oczywiście wszystko zależy od struktury tabel. Ja tylko zgaduję smile.gif
AndyPSV
skorzystam z http://dev.mysql.com/doc/refman/5.1/en/counting-rows.html

wczoraj sie nieco zamulilem, bo za duzo zrobilem wszystkiego - dzis juz wiem jak to rozwiazac, tak aby bylo super wydajnie i po prostu najlepiej

dzieki za pomoc

---

  1. $q = q('SELECT c0,c1,COUNT(*) as cnt FROM `'.PRFX.'x` WHERE '.$sql.' GROUP BY c0'); while($_d = f($q)) $d[] = $_d; var_export($d);# die;
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.