Poprzednia / następna pozycja

2010-03-09 13:48

Mechanizm bardzo przydatny, umożliwiający przechodzenie do następnego lub poprzedniego rekordu z poziomu wybranego już rekordu. Dzięki temu użytkownik nie musi wracać do listy czy też z poziomu listy otwierać dziesiątek stron w osobnych zakładkach by je wszystkie przejrzeć.

Implementacja tego mechanizmu niestety nie jest taka prosta, ale zacznijmy od przygotowania przykładowych danych, na których będziemy operować.

Zakładamy, że nasza lista będzie sortowana wg daty, czyli:

Kliknęliśmy w "JAVA" ("devLanguageId" = 7, "publicationDate" = '2010-03-04') i teraz wiedząc wg czego sortowaliśmy listę, powinniśmy potrafić ustalić rekord poprzedni i następny. Gdyby kolumna "publicationDate" była unikalna, sprawa byłaby bardzo prosta.

W ten sposób uzyskalibyśmy pozycję wybranego języka. Niestety tak nie jest. Powyższe zapytanie zwróci nam wynik 3 bo jest kilka rekordów o tej samej dacie. Zastosowanie operatora "<=" także w niczym nie pomoże bo zawsze zliczy nam wtedy rekordy wcześniejsze plus z wybraną datą, czyli u nas 7. Musimy w naszym zapytaniu uwzględnić dodatkowo kolumnę, która zawsze będzie unikalna, czyli np. "devLanguageId". Oczywiście musimy sortowanie po tej kolumnie dodać także do listy. W niektórych przypadkach sprawdziło by się poniższe zapytanie. Nie uwzględnia jednak ono przypadku gdy data jest mniejsza, a identyfikator większy. Jest to bardzo złudne i przekonałem się o tym na własnej skórze.

Problem możemy rozwiązać na dwa sposoby, za pomocą dwóch zapytań lub jednego.

Oba wyniki do siebie dodajemy, co daje nam liczbę 5. Drugi sposób w jednym zapytaniu:

Tym sposobem udało nam się określić pozycję naszego rekordu i teraz wystarczy tylko pobrać rekord przed i po. W tym celu od liczby 5 odejmujemy 2 (jedną pozycja wstecz + aktualny rekord), jeśli wynik odejmowania wyjdzie nam poniżej 2 należy wpisać 2. U nas wyszło 3, więc nie ma problemu.

I tym sposobem dostajemy poprzedni, aktualny i następny rekord. W szczególnych przypadkach może to być jeden rekord (gdy lista składa się tylko z jednego rekordu) lub dwa rekordy (gdy obecny rekord jest pierwszym lub ostatnim na liście).

Wystarczy teraz w PHP sprawdzić, który z opisanych przypadków otrzymaliśmy.

Edycja:
Draakhan w komentarzach zaproponował użycie dwóch innych zapytań, które zwrócą nam od razu poprzednią i następną pozycję. Jest to zdecydowanie lepsze rozwiązanie niż te powyższe.

Słowa kluczowe: PHP, PostgreSQL, Techblog, lista, następna, poprzednia, sql, artykuł, blog

Projektowanie i tworzenie stron www w PHP5. Opisy i recenzje oprogramowania typu cms, blog, wiki, open source.
Wszelkie prawa zastrzeżone.