Решение лучше всего достигается с помощью предложений SQL limit / offset. Для MySQL это достигается добавлением LIMIT [offset] [count]
к вашему запросу. PostgreSQL использует отдельный синтаксис select ... LIMIT [count] OFFSET [offset]
.
Идея состоит в том, чтобы ограничить количество возвращаемых результатов фактическим числом, которое вы хотите отобразить. Это может привести к значительному увеличению производительности, если вы отображаете страницу 1 из 200, с сотнями результатов на странице.
Конечно, вам нужно выполнить второй запрос - select count(*) from ...
, чтобы определить количество результатов в наборе результатов. Разделите это на количество результатов на странице, и вы получите количество страниц.
Вероятно, вы захотите передать параметр страницы в строке запроса, например,
http://mysite.com/index.php?page=7
, а затем извлеките данные, используя аналогичный метод (рассмотрите этот псевдокод; я знаю, что на самом деле не запрашиваю правильно)
<?php
$num_per_page = 20; // 20 results per page
$page = isset($_GET['page']) ? $_GET['page'] : 0; // start from page 0
// Build our big query minus the SELECT part here
$from_part = 'tbl_results [where ...]"'
$num_results = query("SELECT COUNT(*) FROM $from_part");
// Use ceil to round upwards
$num_pages = ceil($num_results / $num_per_page);
// Cap the page a the last page
if ($page > $num_pages)
$page = $num_pages;
// Cap the page at the first page
if ($page <= 1)
$page = 1;
$offset = $page * $num_per_page;
// Build the final query to select the relevant page of data
$results = query("SELECT * FROM $from_part LIMIT $offset, $num_per_page");
?>