mysql – Найти страницу записи результата в разбивке на страницы

представьте, что мы используем разбиение на страницы, чтобы разбить и отобразить результат mysql, подобный этому, отсортированный по идентификатору автоматической регистрации и дате:

SELECT name FROM members ORDER BY id DESC, date DESC LIMIT $start, $len 

мы показываем, что ссылки на результат и ссылку на страницу ниже, используя php.

как мы можем найти, что номер идентификатора записи x находится на странице этого результата, поэтому мы устанавливаем номер страницы на эту страницу и отображаем эту страницу, а конечный пользователь не должен нажимать навигацию и находить ее?

Solutions Collecting From Web of "mysql – Найти страницу записи результата в разбивке на страницы"

Сначала получите общее количество записей.

 select count(*) as total from members; 

Найти номер члена строки «x» найден в списке записей

 select count(*) oneLess from members where id < (select id from members where name='x'); 

Вышеприведенный запрос возвращает oneLess, номер записи из xie 'x' равен oneLess + 1

Теперь вычислите номер страницы.

 $asc_page_no = floor((($oneLess+1)/$total)*$len); $total_pages = floor($total/$len); $page_no = $total_pages - $asc_page_no; //reverse the page looking direction 

Затем вычислить $ start

 $start = $page_no * $len; 

@ У вас есть хорошее решение, но проблема в том, что ваш PRIMARY KEY автосинхронизирован, поэтому возможно, что 2 id не являются последовательными.

Вы должны добавить столбец, чтобы поместить номер, который вы можете контролировать.

После использования программы в ответ @Bere, но не используйте первичный ключ, используйте новый столбец.

Прежде всего, нам нужно определить номер страницы, где находится желаемая строка:

 SELECT d.myRowSerial, FLOOR((d.myRowSerial-1)/10) AS pageNumber -- Say, 10 is per page; FROM ( SELECT *, @rownum:=@rownum + 1 AS myRowSerial FROM myTable, (SELECT @rownum:=0) AS nothingButSetInitialValue WHERE 1=1 -- Optional: filter if required, otherwise, omit this line; ORDER BY AnyColumn -- Apply the order you like; ) d WHERE d.myColumn = 'Anything'; -- If you like to limit it to only -- for any specific row(s), similar to the *MAIN query. 

У вас будет номер страницы == 0 для страницы 1 и номер страницы == 1 для страницы 2 и т. Д. Затем мы можем просто вычислить номер OFFSET простым вычислением:

 $offset = $myRowSerial * $perPage; 

Теперь мы можем использовать это значение $ offset для нашего MAIN-запроса.