Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Rekord POPRZEDNI i NASTPNY - Zaawansowane
Forum PHP.pl > Forum > Bazy danych > MySQL
pauluZ
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ł?
popbart
Polecenie Limit nie określa od którego id do którego id chcesz mieć wyniki, tylko które chcesz mieć wiersze. I nie ważne jakie masz warunki czy sortowanie.
pauluZ
Cytat(popbart @ 2005-02-07 17:52:55)
Polecenie Limit nie określa od którego id do którego id chcesz mieć wyniki, tylko które chcesz mieć wiersze. I nie ważne jakie masz warunki czy sortowanie.

Dokładnie!
Dlatego bez względu na warunki i sortowanie jeśli pobiorę wiersze poprzedni i następny względem aktualnego to otrzymam to co potrzebuję.
Na razie nie widzę innych rozwiązań do wyciągnięcia tych rekordów (prev,next) oprócz powyższego.
Aha. Wyjaśnienie.
Robię tak bo nie chcę pobierać wszystkich rekordów np. tak:
  1. SELECT id
  2. FROM autorzy WHERE grupa='1' ORDER BY nazwisko,imie;

i potem szukać w php rekordu o id='108' (to z przykładu) i zapamiętać id poprzednie i następne z tej listy.
Chcę aby baza zajęła się wyborem tych właściwych wierszy (prev,next).
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.