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ą.
CREATE TABLE autorzy ( id int(5) UNSIGNED NOT NULL AUTO_INCREMENT, imie varchar(100) NOT NULL DEFAULT '', nazwisko varchar(100) NOT NULL DEFAULT '', grupa smallint(3) NOT NULL DEFAULT '0', PRIMARY KEY (id), KEY nazwisko (nazwisko(15),imie(15)) ) 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)
SELECT * 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:
SELECT * 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)
SELECT COUNT(*) AS maxRecords 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ł?