Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Rekord POPRZEDNI i NASTPNY - Zaawansowane, Problem bynajmniej nie jest trywialny.
pauluZ
post
Post #1





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 9.02.2004
Skąd: Toruń

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


Jest mały opis inne rozwiązania w dziale php dla Początkujących:
http://forum.php.pl/index.php?showtopic=24139

Problem:
Wyszukanie poprzedniego i następnego elementu w liście wyników.
Tak aby móc pokazać linki: POPRZEDNI ... NASTPNY na stronie WWW.

Problem nie jest trywialny bo wielokrotnie sam PRIMARY KEY nie określa
kolejności - mamy często dodatkowe warunki WHERE oraz kolejność np. alfabetyczną.

  1. CREATE TABLE autorzy (
  2. id int(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. imie varchar(100) NOT NULL DEFAULT '',
  4. nazwisko varchar(100) NOT NULL DEFAULT '',
  5. grupa smallint(3) NOT NULL DEFAULT '0',
  6. PRIMARY KEY (id),
  7. KEY nazwisko (nazwisko(15),imie(15))
  8. ) TYPE=MyISAM COMMENT='Autorzy';


Podstawowe zapytanie o porcje danych wygląda tak:
(pobieram wybraną grupę; nazwiska alfabetycznie; 10 rekordów na stronę; od 20-stego)

  1. SELECT *
  2. FROM autorzy WHERE grupa='1' ORDER BY nazwisko,imie LIMIT 20, 10;


Możemy się domyśleć, że id będzie ułożone całkowicie dowolnie... bez regularności.

Wybieram teraz pewien rekord klikająć na stronie WWW np. na nazwisku (wybieram np. id='108')
Na stronie tego autora chce zobaczyć linki POPRZEDNI, NASTPNY w obrębie tej grupy ('1')
oraz wg alfabetu.

Jak znaleźć rekord poprzedni i następny?

Rozwiązanie podejrzane w kodzie phpMyAdmina polega na pamiętaniu od jakiego wiersza wypisane
są wyniki (w przykładzie powyżej: od 20-stego), obliczeniu jaki numer wiersza przypada na
wybranego autora (czyli dla id='108': np. 23) i zastosowaniu potem coś takiego:
skrypt.php?autor=22 - poprzedni
skrypt.php?autor=24 - następny

W skrypcie natomiast stworzeniu zapytania:

  1. SELECT *
  2. FROM autorzy WHERE grupa='1' ORDER BY nazwisko,imie LIMIT $autor,1;


$autor nie może być mniejszy od jeden oraz większy od ilości rekordów
($autor<1) || ($autor>$maxRecords)

  1. SELECT COUNT(*) AS maxRecords
  2. FROM autorzy WHERE grupa='1';

(tutaj mogę pominąć 'ORDER BY' bo nie jest to konieczne)

Jak oceniacie takie rozwiązanie?
Jakieś sugestie? Może ktoś to już rozpracował?

Ten post edytował pauluZ 7.02.2005, 18:07:35
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 19:13