![]() |
![]() ![]() |
![]() |
![]()
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. |
|
|
![]()
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 |
|
|
![]()
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..."
|
|
|
![]()
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(*). |
|
|
![]()
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... |
|
|
![]()
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 ![]() PS. to podswietlenie juz po prostu zalamuje... |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 18.07.2025 - 02:23 |