#sql #bazydanych #programowanie #postgresql Próbuję wdrożyć pagination oparty na metodzie „keyset”, zamiast tradycyjnie „offset”. Wszystko jest jasne dopóki strony idą do przodu np: SELECT * FROM users WHERE id > 1500 ORDER BY ID LIMIT 10. Ale co zrobić gdy użytkownik się cofa? Teoretycznie mogę odwrócić znak większości i zmienić DESC na ASC, ale wtedy otrzymuję wyniki w odwrotnej kolejności. Da się to jakoś lepiej zrobić?
@Alodnog: jeżeli ten where odpowiada za to co myślę, to przy zmianie asc i desc zmień też warunek i jest większa szansa na uzyskanie wyniku, aczkolwiek w czym przeszkadza Ci offset?
@Campell: Czyli chyba wpadłeś na to samo co ja napisałem. A jeśli chodzi o offset to jest po prostu znacznie wolniejszy. Jak zrobisz OFFSET 1000000 LIMIT 10 to postgres i tak musi pobrać ten milion rekordów
@Campell: Jak obrócę tylko znak większości to pobierze mi 10 ostatnich rekordów w bazie, a nie 10 poprzednich. Ogólnie to mi to działa, tylko że muszę po pobraniu wyników posortować je jeszcze raz i jest git. Po prostu zastanawiam sie czy jest jakiś lepszy sposób na to
@Alodnog: nie chodzi mi o odwrócenie znaku większości, jak rozumiem 1500 to jest wartość by uzyskać konkretną stronę. Czyli strzał po następną to jest 1500+x?
@Alodnog: to nie możesz przy cofaniu pójść zwyczajnie w tył? 1490? Chyba, że czegoś nie rozumiem w twoim przypadku użycia, e takim razie przepraszam za zamieszanie.
@Campell: W sensie jak pójść w tył? Ja tylko w tym moim WHERE zaznaczam granicę od której liczyć rekordy, więc jeśli chciałbym się cofnąć to mógłbym zrobić WHERE id < 1500 ORDER BY id ASC LIMIT 10. I to zadziała, zwróci mi 10 właściwych rekordów, ale w odwrotnej kolejności niż bym szedł do przodu
@Alodnog: Wybierz interesujące Cię rekordy ze strony w podzapytaniu i tam zrób asc/desc jak tam chcesz, a w nadrzędnym zapytaniu posortuj jeszcze raz po tym czym chcesz czyli po id. np.
select * from ( select SELECT * FROM users WHERE id < 1500 ORDER BY ID DESC LIMIT 10 ) as pusr order by pusr.id asc;
Próbuję wdrożyć pagination oparty na metodzie „keyset”, zamiast tradycyjnie „offset”.
Wszystko jest jasne dopóki strony idą do przodu np:
SELECT * FROM users WHERE id > 1500 ORDER BY ID LIMIT 10.Ale co zrobić gdy użytkownik się cofa? Teoretycznie mogę odwrócić znak większości i zmienić DESC na ASC, ale wtedy otrzymuję wyniki w odwrotnej kolejności. Da się to jakoś lepiej zrobić?
źródło: comment_1611067419eLX7l6HWdpi5hdPRa7JQng.jpg
PobierzWHERE id < 1500 ORDER BY id ASC LIMIT 10. I to zadziała, zwróci mi 10 właściwych rekordów, ale w odwrotnej kolejności niż bym szedł do przoduselect * from (
select SELECT * FROM users WHERE id < 1500 ORDER BY ID DESC LIMIT 10
) as pusr
order by pusr.id asc;