Postgres нумерация страниц с неуникальными ключами? - PullRequest
0 голосов
/ 04 июля 2018

Предположим, у меня есть таблица событий с (проиндексированными) столбцами id : uuid и created : timestamp.

Столбец id является уникальным, а столбец created - нет. Я хотел бы пройтись по таблице в хронологическом порядке, используя столбец created.

Примерно так:

SELECT * FROM events WHERE created >= $<after> ORDER BY created ASC LIMIT 10

Здесь $<after> - это параметр шаблона, который взят из предыдущего запроса.

Теперь я вижу две проблемы с этим:

  1. Поскольку created не является уникальным, порядок не будет полностью определен. Возможно, сортировка должна быть id, created?
  2. Каждая строка должна быть только на одной странице, но в этом запросе последняя строка всегда включается на следующей странице.

Как мне поступить об этом в Postgres?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018
SELECT * FROM events 
  WHERE created >= $<after> and (id >= $<id> OR created > $<after>)
  ORDER BY created ASC ,id ASC LIMIT 10

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

0 голосов
/ 04 июля 2018

Во-первых, как вы сказали, вы должны ввести полный порядок. Поскольку главное, что вас волнует - это created, вам следует начать с этого. id может быть вторичным заказом, прерывателем связи, невидимым для пользователя, который просто гарантирует, что заказ соответствует. Во-вторых, вместо того, чтобы возиться с условиями на created, вы можете просто использовать предложение offset для получения более поздних результатов:

SELECT * FROM events ORDER BY created ASC, id ASC LIMIT 10 OFFSET <10 * page number>
-- Note that page number is zero based 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...