Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Rekord POPRZEDNI i NASTPNY - Zaawansowane, Problem bynajmniej nie jest trywialny.
pauluZ
post 7.02.2005, 16:24:28
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


--------------------
pauluZ
Go to the top of the page
+Quote Post
popbart
post 7.02.2005, 16:52:55
Post #2





Grupa: Zarejestrowani
Postów: 255
Pomógł: 0
Dołączył: 22.04.2004
Skąd: Żoliborz

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


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.


--------------------
Visual Basic - kto by pomyślał :)
Go to the top of the page
+Quote Post
pauluZ
post 7.02.2005, 17:54:15
Post #3





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

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


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).


--------------------
pauluZ
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 09:48