SQL / MySQL: общий дизайн номера строки / индекса / предложения для разбиения на страницы - PullRequest
0 голосов
/ 14 мая 2011

Моя задача состоит в том, чтобы у меня была таблица, например, сообщений на форуме, и я хочу получить правильное смещение для предложения LIMIT.

Чтобы проиллюстрировать пример: Table Post - пожалуйста, помните, что OFFSET - это число /Индекс строки.

OFFSET 0: ID = 17, AUTHOR = ABC, CREATE_DATE = 2011-05-01
OFFSET 1: ID = 39, AUTHOR = ABC, CREATE_DATE = 2011-05-02
OFFSET 2: ID = 77, AUTHOR = ABC, CREATE_DATE = 2011-05-03
OFFSET 3: ID = 78, AUTHOR = ABC, CREATE_DATE = 2011-05-04
OFFSET 4: ID = 99, AUTHOR = ABC, CREATE_DATE = 2011-05-05
OFFSET 5: ID = 33, AUTHOR = ABC, CREATE_DATE = 2011-05-06
OFFSET 6: ID = 45, AUTHOR = ABC, CREATE_DATE = 2011-05-07
OFFSET 7: ID = 11, AUTHOR = ABC, CREATE_DATE = 2011-05-08
OFFSET 8: ID = 13, AUTHOR = ABC, CREATE_DATE = 2011-05-09
OFFSET 9: ID = 88, AUTHOR = ABC, CREATE_DATE = 2011-05-10

Теперь я хочу сделать запрос для ID = 45, и моя нумерация страниц должна дать результат 5 записей на странице.

SELECT Table.* FROM Table WHERE Table.id = 45 ORDER BY Table.create_date;

Результат одинстрока с ID = 45. И тогда я хочу знать, что смещение составляет 6 по отношению к 10 записей в общей сложности в таблице.Мне нужно 5 строк на страницу, поэтому x = 5 для следующего оператора.

Другими словами, я знаю, что строка со смещением = 6 находится на 2-й странице страницы результатов с 5 записями на странице.

SELECT Table.* FROM Table LIMIT x, 5

Откуда я знаю x?

Моя первая идея - я выбираю все идентификаторы из таблицы и просто ищу правильный идентификатор, а затем делю смещение на 5.

Вопрос: Есть ли лучший способ сделать это в SQL, потому что мне кажется, что это очень распространенная проблема?

Дополнительный вопрос: SQL-решение хорошо;как это сделать в MySQL конкретно, если есть разница?

1 Ответ

2 голосов
/ 14 мая 2011

Обычно лучше заключить транзакцию в несколько запросов.Псевдокод:

select count(*) from table
where create_date <= (select create_date from table where id = 45);

select table.* from table order by create_date limit 5 offset :offset;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...