Skocz do zawartości

Wyświetlanie określonej liczby wyników


Hellz

Rekomendowane odpowiedzi

Witam

Piszę sobie CMS'a i mam taki dylemat. Gdy wyświetlam np. listę adminów, muszę ją ograniczyć, dajmy na to do 10 wyników na stronę. Są one pobierane z bazy MySQL. Przy pierwszym wywołaniu listy muszę wykonać pełne zapytanie, żeby zobaczyć ile zwróci wierszy. Gdy będzie to powiedzmy 54, a ja chcę wyświetlić tylko 10 rodzi się problem. Nie wiem, czy mam ograniczyć liczbę wyników przez:

+ wykonanie ponownego zapytania, tym razem z LIMIT 0,10

+ nie wykonywać dodatkowego zapytania, zapisać wyniki w tablicy i użyć array_slice do wyświetlenia przykładowych 10

+ stworzyć oddzielną tabelę i tam zapisywać sobie ilość wyników z każdej wielowierszowej tabeli, a następnie na jej podstawie wyciągać wyniki tylko LIMIT'em

Jak sądzicie, który sposób będzie najbardziej "elegancki" i w miarę wydajny. Lepiej operować na dużych tablicach, czy zadać MySQL'owi dodatkowe pytanie. A może znacie lepszy sposób?

Mam nadzieję, że da się zrozumieć mojego posta :) Pozdrawiam i czekam na sugestie

Dała matka rozum? To kombinuj.

Odnośnik do komentarza
Udostępnij na innych stronach

Przy liście adminów jeśli w ACP to można wykonać dodatkowe zapytanie.

Jeżeli wiesz że liczba rekrdów jest mała to tablica.

Przy odzielnej tabeli będziesz musiał wykonywać jedno zapytanie więcej np. przy dodawaniu komentarzy.

stopka usunieta z wpoodu wirusa na stronie docelowej

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, dzięki za odpowiedź. To był niestety tylko przykład, bo przecież w CMS'ie muszą się znaleźć np. listy artykułów i wtedy wczytywanie powiedzmy 2k rekordów może już nastręczać problemy. Więc może zapytam inaczej, jak byście to zrobili w wypadku dużej liczby rekordów?

Dała matka rozum? To kombinuj.

Odnośnik do komentarza
Udostępnij na innych stronach

ja bym to zrobił tak

robię zapytanie o liczbę wszystkich interesujących mnie rekordów. żeby potem przy przejściach między stronami nie powtarzać tego zapytania, zapisuję tą liczbę w zmiennej sesyjnej

mając daną liczbę wszystkich rekordów oraz ilość rekordów na stronę obliczam ilość stron i z tego generuję sobie linki do przełączania między stronami.

i potem właściwe zapytanie o rekordy z danej strony z klauzulą LIMIT $offset, $numberofrecords gdzie offset to pierwszy rekord jaki ma być wyświetlony

w ten sposób masz jedno zapytanie przy każdym wywołaniu (przy pierwszym wywołaniu dwa, potem czytasz wartość z sesji) i z głowy

w razie czego służę na pw krótkim przykładem kodu :)

Kup sobie nieruchomości Kraków albo apartamenty Zakopane. Obejrzyj też fotoblog Grzegorza Ziemiańskiego Nowa Huta na deser

Odnośnik do komentarza
Udostępnij na innych stronach

2k rekordów to nie jest duża baza - to maleństwo - nie powinno się zamulić o ile nie jest to zapytanie do tabeli połączonej z 10 innymi tabelami joinem.

Ja wybrałbym rozwiązanie nr. 1

1. Select o liczbę rekordów - np po jedej kolumnie (nie z gwiazdką)

2. Select z LIMIT x, y

Dodatkowo - jeśli zablokuje dane tabele na czas wykonania obydwu select-ów - dane nie zmienią się w międzyczasie)

bo rozwiązanie 2.

Jeśli się baza rozrośnie - to będziesz za każdym razem pobierał z bazy pełne dane i zapisywał w tablicy - a to sporo zeźre i czasu i mocy obliczeniowej.

bo rozwiązanie 3.

Musisz pilnować (to może być ważne albo i nie) synchronizacji - ktoś zapisał właśnie coś a ty masz w dodatkowej tabeli (tej od liczby wyników) stare dane.

Odnośnik do komentarza
Udostępnij na innych stronach

robię zapytanie o liczbę wszystkich interesujących mnie rekordów. żeby potem przy przejściach między stronami nie powtarzać tego zapytania, zapisuję tą liczbę w zmiennej sesyjnej

101073[/snapback]

Być może liczba rekordów nie ma znaczenia i jest tylko informacyjna - ale jeśli na jej podstawie robisz jakieś obliczenia a w międzyczasie baza się zwiększyła (inna osoba coś dopisała) - to na czas sesji masz już przeterminowane dane.

Ale zwykle na 90% - jeśli liczba rekordów jest tylko "mam w bazie 2445 produktów" - to spokojnie można użyć tej metody.

Odnośnik do komentarza
Udostępnij na innych stronach

a ja tylko dodam, że w przypadku panelu admina stosuje zasadę: full funkcjonalności, full zapytań :) tzn. bez przesady :) ale w takim przypadku nie zastanawiam sie jak maxymalnie zredukowac liczbe zapytan. taki admin to sobie porobi coś raz na ruski rok :) i co mu bede pytań żałował :)

Odnośnik do komentarza
Udostępnij na innych stronach

a ja tylko dodam, że w przypadku panelu admina stosuje zasadę: full funkcjonalności, full zapytań :) tzn. bez przesady :) ale w takim przypadku nie zastanawiam sie jak maxymalnie zredukowac liczbe zapytan. taki admin to sobie porobi coś raz na ruski rok :) i co mu bede pytań żałował :)

101083[/snapback]

Oj nie zawsze. Miałem przypadek że CMS-a (portalu) obsługiwało średnio 5 - 10 osób - fajna jazda była z samymi rangami userów i adminów, poziomami dostępu, priorytetami zapisu i odczytu do bazy itd.

Więcej mulili niż już sam system dla użytkownika.

Ale jeśli to ma obsługiwać 1 osoba - to też bardzo się nie przejmuję :)

Odnośnik do komentarza
Udostępnij na innych stronach

Ale nie przy skomplikowanych systemach gdzie liczymy każde zapytanie i funkcje :)

Zresztą po co wywoływać tak kretyńskie zapytanie skoro mozna stworzyć kolumne np user_topics w forums i według tego tworzyć paginacje?

stopka usunieta z wpoodu wirusa na stronie docelowej

Odnośnik do komentarza
Udostępnij na innych stronach

Lepiej jest IMHO od razu wykonywac zapytania z LIMITem i opcjonalnie ustawiac po ile wynikow chcesz wyswietlac na stronie. Mozna sobie spokojnie napisac funkcje, ktora generuje takie zapytania na podstawie 2 zmiennych:

1) il. wyników na stronie

2) numer strony do wyswietlenia

wtedy jesli wyników jest mniej niż miesci sie na stronie, wyswietla sie wszystkie, jesli wiecej nalezy dodatkowy wyswietlic pasek zmiany strony :)

NEOTERIC Mateusz Kurleto

strony www sklepy internetowe webdesign

Odnośnik do komentarza
Udostępnij na innych stronach

"SELECT count(*) FROM tabela"
Za długo dzisiaj siedziałem przy kompie, takie proste rozwiązanie i mi nie przyszło do głowy :) Wydaje mi się, że podstawiając zamiast * kolumnę klucza rozwiązanie będzie szybkie i skuteczne, o to chodziło :)

Dała matka rozum? To kombinuj.

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności