Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Błędne zliczanie ilości wyników
mefistofeles
post
Post #1





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 23.06.2009

Ostrzeżenie: (10%)
X----


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ć ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Pierwsze zapytanie zawiera jeszcze GROUP BY, zaś drugie nie. Group by daje zupelnie inne wyniki


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mefistofeles
post
Post #3





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 23.06.2009

Ostrzeżenie: (10%)
X----


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ę ?
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mefistofeles
post
Post #5





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 23.06.2009

Ostrzeżenie: (10%)
X----


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.

Ten post edytował mefistofeles 22.10.2010, 08:09:52
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mefistofeles
post
Post #7





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 23.06.2009

Ostrzeżenie: (10%)
X----


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 :/
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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;


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
mefistofeles
post
Post #9





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 23.06.2009

Ostrzeżenie: (10%)
X----


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 :/
Go to the top of the page
+Quote Post
bmL
post
Post #10





Grupa: Zarejestrowani
Postów: 301
Pomógł: 25
Dołączył: 15.07.2007
Skąd: Olsztyn

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


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

Ten post edytował bmL 22.10.2010, 19:14:24


--------------------
Tutaj miał być jakiś mądry tekst. Miał być... No ale jest głupi tekst.
Go to the top of the page
+Quote Post
mefistofeles
post
Post #11





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 23.06.2009

Ostrzeżenie: (10%)
X----


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

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 Aktualny czas: 21.08.2025 - 14:17