Получить первую строку всех страниц, а также разбить на страницы (LIMIT / OFFSET) - PullRequest
0 голосов
/ 25 мая 2020

У меня есть таблица записей (в основном: слова), которые можно отсортировать по алфавиту. Я уже знаю общее количество страниц, поэтому могу отобразить что-то вроде 1 2 3 ... 19 20 с обработчиком OnClick для перехода на новые страницы. Если результат для определенной страницы c уже был загружен, он просто покажет его, в противном случае будет выдан новый запрос SQL с OFFSET и LIMIT.

Теперь было бы здорово иметь всплывающую подсказку отображение первой записи на каждой странице, когда пользователь наводит курсор на ссылку для страницы «3». Я знаю, что могу отправить запрос onMouseOver, но можно ли получить этот список уже в самом первом запросе?

Пример таблицы слов :

+-ID-+----Word---+
+  1 + ability   +
+  2 + able      +
+  3 + about     +
+  4 + above     +
+  5 + accept    +
+  6 + according +
+  7 + account   +
+----+-----------+

Пример исходный запрос (очевидно, LIMIT 2 будет примерно как LIMIT 50 в реальном запросе)

SELECT * FROM words ORDER BY word ASC LIMIT 2 OFFSET 0

Пример дальнейшего запроса (например, если пользователь нажал на страницу "3"):

SELECT * FROM words ORDER BY word ASC LIMIT 2 OFFSET 4

Желаемый результат:

Я бы хотел получить один начальный запрос, который возвращает способность и способность (очевидно), но затем также возвращает около (первый элемент на странице 2), accept (первый элемент на странице 3) и счет (первый пункт на странице 4). Опять же, я уверен, что это будет легко с обработчиком событий в MouseOver или чем-то в этом роде или, вероятно, будет не слишком сложно с двумя последующими запросами, но я бы хотел сделать это в одном запросе, если это возможно. Было бы лучше, если бы элементы «первая из других страниц» назывались по-другому, но я думаю, что с этим также можно было бы по-другому управлять. Первоначальный запрос всегда будет с OFFSET 0 (т.е. пользователь не может начать со страницы 12).

Сейчас PostgreSQL Версия 12.1

1 Ответ

1 голос
/ 25 мая 2020

Если вам нужен один запрос, который возвращает строку nth , вы можете использовать row_number() и по арифметическому модулю c:

select w.*
from (select w.*, row_number() over (order by word) as seqnum
      from words w
     ) w
where w.seqnum % 50 = 1;

Вы можете сделать это, используя просто id, если он последовательный, без пробелов, начинается с 1 и представляет собой порядок слов.

...