Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Num_rows przy limicie
Forum PHP.pl > Forum > Bazy danych > MySQL
NaC
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.
orson
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
DeyV
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)
adwol
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(*).
NaC
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...
uboottd
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...
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.