Как выполнить управление страницей?

Я имею в виду, какой самый эффективный способ получить информацию о количестве элементов вашей страницы и сделать sql-запрос с LIMIT, который вам нужен. или я должен получить все элементы, а затем обрезать массив с помощью функций php?

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

Хорошо, я буду более конкретным. Например мне нужно показать вопрос на моей странице и 20 ответов на этот вопрос. Внизу должно быть управление страницей: ссылки на следующую, предыдущую страницу и так далее. Я хочу показать правильное количество ссылок (количество ответов/20), и когда я перехожу по любой ссылке, я хочу получать правильные ответы (например, от 41 до 60 на 3-й странице). Итак, как лучше всего получить количество элементов (ответов), чтобы показать правильное количество ссылок и получить правильные ответы для каждой ссылки?


person user37590    schedule 14.11.2008    source источник
comment
Я понятия не имею, чего вы пытаетесь достичь, можете ли вы переформулировать вопрос?   -  person Michiel Overeem    schedule 14.11.2008
comment
Попробуйте поискать по разбивке на страницы, уже есть ответы на множество похожих вопросов.   -  person Tom Haigh    schedule 14.11.2008


Ответы (2)


Я предполагаю, что вы хотите подсчитать количество строк, которые вы будете читать, чтобы выполнить разбивку на страницы или что-то подобное? Я не понимаю вашей потребности в LIMIT в контексте вашего вопроса. Однако, если вы просто хотите подсчитать, сколько строк было найдено, используйте один из следующих способов.

Вы выбираете количество всех строк, таких как:

select count(*) as counted, name, address
from contact

Или найденные строки:

SELECT SQL_CALC_FOUND_ROWS, name, address
from contact

Это может быть специфично для MySQL, я не уверен.

Обновлять:

Для разбивки на страницы вы должны сделать что-то вроде следующего: (Psuedocode)

$rows = array($result)
$num_rows = sql_calc_found_rows
$per_page = 20
$pages = ceil($num_rows / $per_page)

страница
$rows_this_page = array()
$rows_this_page = get_values($rows, (минимальный индекс)$page_number * $per_page - $per_page, (максимальный индекс)$page_number * $per_page - 1)

person Josh Smeaton    schedule 14.11.2008
comment
большое спасибо, мне нужен LIMIT, чтобы получить правильные вопросы (ответы), или я должен это сделать? - person user37590; 14.11.2008
comment
Вы используете LIMIT только в том случае, если вам нужно известное количество строк.. например, если вам нужны 50 лучших ответов, которые вы бы упорядочили по наивысшему баллу и ограничили до 50. Тогда вам вообще не понадобится подсчет. Вы должны объяснить свой вопрос немного лучше. - person Josh Smeaton; 14.11.2008
comment
хорошо, если мне нужны ответы от 31 до 50, я использую LIMIT 31,20, не так ли? - person user37590; 14.11.2008
comment
Я полагаю, да.. но тогда зачем вам вообще нужно количество строк? - person Josh Smeaton; 14.11.2008
comment
чтобы показать правильное количество ссылок внизу страницы: num_of_items/items_per_page - person user37590; 14.11.2008
comment
Затем следуйте ответу Штейна, это путь. Получите sql_calc_found_rows с остальной частью вашего запроса и используйте его для значения разбиения на страницы. - person Josh Smeaton; 14.11.2008
comment
было бы лучше использовать LIMIT {ceil($num_rows / $per_page)}, {$per_page} с SQL_CALC_FOUND_ROWS, потому что он вернет количество найденных строк, поскольку нет оператора LIMIT. спасибо еще раз - person user37590; 14.11.2008

Я предполагаю, что вы пытаетесь сказать, что хотите знать, сколько элементов/ответов содержится в запросе, но читаете только до 20 элементов за раз для разбиения на страницы.

Во-первых: вам действительно следует искать пакет разбиения на страницы; У многих и многих людей была такая же проблема раньше, и, вероятно, существуют как бесплатные / открытые, так и проприетарные решения для вашего языка программирования и фреймворка. (Если вы скажете, какой язык вы используете, я уверен, что кто-то может порекомендовать вам решение.)

В любом случае, я знаю, что мне нравится знать, как все устроено, поэтому обычно это происходит так:

Насколько я знаю, код разбивки на страницы вычисляет страницы, выполняя один запрос, используя select count(*) from tblX where something, делит это число на количество элементов на странице и использует потолок (например, 4.1 => 5).

Для вывода результатов на страницу требуется новый запрос; не волнуйтесь, запрос подсчета ужасно намного быстрее, чем получение каждого результата, отбрасывая те, которые вам не нужны НЕ ДЕЛАЙТЕ ЭТОГО (это рецепт, чтобы стать главной новостью на этой страницы). Что-то вроде select * from tblX where something limit Y offset Z, где Y — количество элементов на странице, а Z — (requested_page - 1)*Y; страница 1 будет иметь смещение 0, страница 2 будет иметь смещение 20 (если это Y) и т. д.

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

person Stein G. Strindhaug    schedule 14.11.2008
comment
Я был бы более склонен загружать их все в массив (php), передавать массив со страницы на страницу и перечислять подмножество этого массива на каждой странице. Таким образом, вы избегаете многих обращений к базе данных. Только действительно необходимо, если у вас много трафика и запросов. - person Josh Smeaton; 14.11.2008
comment
а если там 10000 штук? передать такой массив? или делать запрос каждый раз? - person user37590; 14.11.2008