Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Num_rows przy limicie
NaC
post 19.09.2003, 22:25:56
Post #1





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

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


Robie prosta wyszukiwarke, w zapytaniu mam limit, gdzie $ile to ilosc wynikow per site, a $od zwieksza sie na podstawie linku na stronie (aby tworzyc podstrony musze uzyc drugiego zapytania, query2, identycznego jak ponizsze, lecz bez limitu i wtedy uzyc np. mysql_num_rows)

[sql:1:0771f13432]
$query = mysql_db_query("SELECT * FROM db_news where $content like '%$wyrazenie%' order by $sort2 LIMIT $od,$ile");
[/sql:1:0771f13432]

Pytanie: Czy da sie to zrealizowac w jednym zapytaniu, bez koniecznosci uzywania drugiego tylko po to, aby wiedziec ile jest wszystkich wynikow na stronie (i dzieki temu np. zrobic podstrony) ?
Wiem, ze dla wersji 4.0 Mysqla dziala funkcja SQL_CALC_FOUND_ROWS, ale co zrobic w przypadku starszych ? Da sie to jakos rozwiazac w jednym zapytaniu (moze count ?) lub programistycznie ?
Zaznaczam, ze jestem poczatkujacym.
Go to the top of the page
+Quote Post
orson
post 19.09.2003, 22:46:17
Post #2





Grupa: Zarejestrowani
Postów: 548
Pomógł: 2
Dołączył: 19.07.2003

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


witam

sprobuj tak:
[sql:1:0332e368c7]
SELECT *,COUNT(tu_np_id) AS ilosc
FROM db_news
WHERE $content like '%$wyrazenie%'
ORDER by $sort2
LIMIT $od,$ile
[/sql:1:0332e368c7]
i w polu ilosc masz ilosc wynikow pasujacych ... powinno dzialac ...

cya
Go to the top of the page
+Quote Post
DeyV
post 20.09.2003, 11:37:49
Post #3





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Wydaje mi sie, ze możesz nie przejmowac sie tym, ze powstaje 2 zapytanie. MySQL radzi sobie bardzo szybko z zapytaniami o ilość rekordó, wiec nie ma sensu mnożyć ilości danych dostarczanych do php przy pomocy rozwiazania orsona (które jednak samow sobie jest raczej poprawne)


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
adwol
post 20.09.2003, 12:43:32
Post #4





Grupa: Zarejestrowani
Postów: 691
Pomógł: 0
Dołączył: 6.08.2003

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


Cytat
rozwiazania orsona (które jednak samow sobie jest raczej poprawne)

Raczej nie do końca. Selekcja wyrażeń agregujących i wyrażeń kolumnowych wymaga frazy group by, która z kolei w tym wypadku przeszkadza. Najprościej chyba będzie jednak użyć tego drugiego zapytania z count(*).
Go to the top of the page
+Quote Post
NaC
post 20.09.2003, 20:17:49
Post #5





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

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


Rozwiazanie orsona chyba raczej nie jest poprawne, tak jak wspomnial moj poprzednik :
MySQL zwrócił komunikat: Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY

Natomiast mozna uzyc count bez group by w takim wypadku
[sql:1:c0c3994777]
SELECT count(id) AS ile from db_download where kategoria='2'
[/sql:1:c0c3994777]

Chodzi tutaj o to, ze jezeli uzywamy count bez group by, to nie mozemy innych kolum mniec w wyniku ? Bo nie wiem dokladnie...
W kazdym badz razie, jezeli nie widzicie innych rozwiazan (a na forum widze prawdziwych 'wymiataczy' z umiejetnosciami, ktorych mozna tylko pozazdroscic), to uzyje tego drugiego zapytania.
Myslalem, ze im wiecej zapytan, tym wolniej to wszystko dziala - jezeli mysql radzi sobie szybko z zapytaniami o rekordy, to przy jakich trzeba sie glowic, aby bylo ich jak najmniej ?
Pozniej z tego drugiego zapytania wyciagalem ilosc wynikow za pomoca funkcji mysql_num_rows, ale wczoraj dowiedzialem sie, ze w zapytaniu szybciej count zlicza to, jak to moj poprzednik napisal.
Ciekawe jak ta nowa funkcja w mysql4.0, o ktorej powyzej napisalem by sie spisala.

Ps. Swoja droga widzialem, ze przeciez przy takim zapytaniu phpmyadmin wyswitla ilosc wierszy (total), a watpie, zeby robil sobie drugie zapytanie bez limitow...
Go to the top of the page
+Quote Post
uboottd
post 22.09.2003, 10:10:56
Post #6





Grupa: Zarejestrowani
Postów: 384
Pomógł: 0
Dołączył: 3.04.2003
Skąd: Chorzow

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


prawidlowe rozwiazanie jest takie:
do zapytania dodaje sie opje SQL_CALC_FOUND_ROWS:
[sql:1:890e2bbe5e]
SELECT SQL_CALC_FOUND_ROWS *
FROM tabele..... itd.
LIMIT x,y
[/sql:1:890e2bbe5e]
Wykonuje sie to zapytanie, po czy wysyla sie nastepujace zapytanie:
[sql:1:890e2bbe5e]
SELECT FOUND_ROWS()
[/sql:1:890e2bbe5e]
Ktore zwraca ilosc znalezionych wierszy w poprzednim zapytaniu z pominieciem klauzuli LIMIT.

Drugie zapytanie takie same jak pierwsze tylko bez limitu jest o tyle beznadziejne, ze zapytanie moze byc dosc skomplikowane z duza iloscia sklejen, liczonych wyrazen itp. powtorzenie ktorego na pewno nie przyspieszy dzialania skryptu winksmiley.jpg

PS. to podswietlenie juz po prostu zalamuje...
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 Wersja Lo-Fi Aktualny czas: 18.07.2025 - 02:23