Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Błędne zliczanie ilości wyników
Forum PHP.pl > Forum > Przedszkole
mefistofeles
Mam takie zapytanie:

  1. $sql = 'SELECT id,tytul FROM `ksiazki` WHERE match(tytul) against ("+'.$autor.'*" IN BOOLEAN MODE) GROUP BY tytul order by match(tytul) against("+'.$autor.'*") desc LIMIT ' . $page_query*$na_stronie . ', ' . $na_stronie;


Jak policzyć ogólną liczbę rekordów, które ono zwraca bo mam z tym problem.

Próbowałem np tak:

  1. echo $sqlll = 'SELECT count(*) ilosc FROM `ksiazki` WHERE match(tytul) against ("+'.$autor.'*" IN BOOLEAN MODE)';)';


Ale zwraca mi to całkiem inna liczbę rekordów niż zwraca mi pierwsze zapytanie (usuwając oczywiście desc LIMIT ... )

Jak to inaczej zliczyć ?
nospor
Pierwsze zapytanie zawiera jeszcze GROUP BY, zaś drugie nie. Group by daje zupelnie inne wyniki
mefistofeles
Rozumiem, dlaczego jednak:

  1. SELECT count(*) ilosc FROM `ksiazki` WHERE match(tytul) against ("+nazwa+2+*" IN BOOLEAN MODE) GROUP BY tytul
  2. $abc = mysql_query($sqlll);
  3. $row1 = mysql_fetch_array($abc);
  4. echo "Ilość:".$row1[ilosc];


Zwraca mi: 1

Gdy wkleje zapytanie do myadmina dostaję ponad 50 rekordów.
Co źle robię ?
nospor
Wklej do PMA dokładnie to samo zapytanie. Na 100% teraz tego nie robisz.

W php Twoje zapytanie powiedzmy budujesz tak:
$sql = 'blabla twoje zapytanie';

Masz to zapytanie wyswietlić:
echo $sql;

I dokładnie to co ci zwróci echo $sql masz wkleić do PMA.
mefistofeles
Dokładnie tak robiłem:

  1. [php]echo $sqlll = 'SELECT count(*) ilosc FROM `ksiazki` WHERE match(tytul) against ("+'.$nazwa.'*" IN BOOLEAN MODE) GROUP BY tytul';
  2. $abc = mysql_query($sqlll);
  3. $row1 = mysql_fetch_array($abc);
  4. $total_items = $row1[ilosc];
  5. echo "Razem:".$total_items;


W PMA dostaje wynik który jest inny niż $total_items, zwykle dużo większy.
nospor
aaa..., bo GROUP BY zwróci ci kilka rekordów a nie tylko jeden.
A ty robiąc mysql_fetch_array() pobierasz tylko pierwszy zwrócony rekord smile.gif

Musisz uzyc petli WHILE by pobrac wszystkie wyniki
mefistofeles
W ten sposób smile.gif

Rzeczywiście jak zrobiłem:

  1. while($row1 = mysql_fetch_array($abc)) {
  2. echo $total_items=$row1[ilosc]."<br>";
  3. }

To drukuje mi kilka rzędów liczb, ich suma jest pewnie tą o którą chodzi, jednak jak to teraz dodać?

Jak próbuje zrobić tak:
  1. while($row1 = mysql_fetch_array($abc)) {
  2. $total_items[]=$row1[ilosc];
  3. }

To w ogóle nic mi nie wyświetla :/
nospor
chcesz dodac a uzywasz tablicy? W pierwszej klasie nie uczyli cię dodawania? winksmiley.jpg
  1. $total_items = 0;
  2. while($row1 = mysql_fetch_array($abc)) {
  3. $total_items+=$row1['ilosc'];
  4. }
  5. echo $total_items;
mefistofeles
Coś mi się popierniczyło...
Mam teraz coś takiego:

  1. $total_items = 0;
  2.  
  3. $abc = mysql_query($sqlll);
  4. while($row1 = mysql_fetch_array($abc)) {
  5.  
  6. $total_items+=$row1['ilosc'];
  7.  
  8.  
  9. }
  10. echo $total_items;


Jednak suma jaką otrzymuje nie jest taka jak pokazuje PMA na to zapytania :/
bmL
Cytat(mefistofeles @ 21.10.2010, 05:38:44 ) *
  1. $sql = 'SELECT id,tytul FROM `ksiazki` WHERE match(tytul) against ("+'.$autor.'*" IN BOOLEAN MODE) GROUP BY tytul order by match(tytul) against("+'.$autor.'*") desc LIMIT ' . $page_query*$na_stronie . ', ' . $na_stronie;


Nie lepiej użyć DISTINCT skoro i tak nic nie zliczamy?

Drążąc temat dalej to jeżeli mamy fetchować i zliczać xx wyników (gdzie pewnie i tak każdy result zawiera w sobie pole o wartości 1 bo wątpię żeby tytuł książki się powtarzał), to mija się z celem używanie tego count... Już lepiej by było wykonać identyczne zapytanie do tego pierwszego tylko nie pobierać tytułu książki (bo nie potrzebny) i użyć mysql_num_rows();
W skrócie albo wymyślisz zapytanie które to zliczy wszystko razem (nie mam pomysłu jak to zliczyć tak żeby zwróciło w 1 ładnym wyniku) albo nie paćkać się i użyć zwykłego mysql_num_rows().

EDIT: z resztą takie zliczanie pętlą pewnie zwróciło by więcej niż to pierwsze zapytanie bo zliczyło by wszystkie rekordy nawet te powtarzające się.

Przykład:
Kod
ID : tytul

1: A
2: A
3: B
4: C

$q = 'SELECT id,tytul FROM ksiazki GROUP BY tytul';
$r = $q -> fetch_row();
// $r= array(array(1,A), array(3,B), array(4,C));
// $r -> num_rows = 3

$q = 'SELECT count(*) FROM ksiazki GROUP BY tytul';
$r = $q -> fetch_row();
// $r = array(array(2),array(1),array(1));
// gdybyśmy zsumowali to pętlą to wyszło by 4 a nie 3.

O ile mi się nic nie poje*** to się wszystko zgadza tongue.gif

ps. wybaczcie tą wyimaginowaną obsługę sterownika bazy danych smile.gif
mefistofeles
Trochę już się to wszystko skomplikowane zrobiło.
Myślałem, że zliczenie ilości wyników nie będzie nastręczało aż takich problemów, a tutaj widze problem jest spory. ale będę walczył :|
(Jeśli chodzi o tytuły książek to często się powtarzają z różnych powodów)

Zauważyłem jeszcze jeden bardzo nie fajny problem.
Mianowicie zapytanie:


  1. $sql = 'SELECT id,tytul FROM `ksiazki` WHERE match(tytul) against ("+'.$autor.'*" IN BOOLEAN MODE) GROUP BY tytul order by match(tytul) against("+'.$autor.'*") desc LIMIT ' . $page_query*$na_stronie . ', ' . $na_stronie;


Daje mi jakieś 'z kosmosu' wyniki dla zapytań które mają 3 lub mniej znaków.
Gdy chce wyszukać tytuł który ma 3 znaki wyniki w ogóle nie maja nic do rzeczy z tymi które zwraca analogiczne zapytanie z LIKE i są do d....
Dlaczego tak się dzieje ?
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.