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
19.09.2003, 22:46:17
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
20.09.2003, 11:37:49
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
20.09.2003, 12:43:32
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(*).
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
22.09.2003, 10:10:56
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
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.