2009-03-17 5 views
3

Надеюсь, я не пишу дубликат, но я не нашел ничего, что могло бы ответить на мой вопрос. (Хотя мне кажется, что это довольно распространенная проблема.)Как определить «количество страниц» наиболее эффективно?

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

Теперь интересно, какой лучший способ вычислить количество страниц, необходимых для определенного набора строк таблицы.

Вот некоторые подходы, о которых я думал. Я хотел бы получить отклик на то, насколько они эффективны. Я дам примеры, специфичные для PHP, но я уверен, что на других языках есть аналогичные методы.

  1. Возможно, лучший способ - сохранить число страниц статически и изменить значение каждый раз при добавлении новой записи. (Тем не менее ... Я ищу динамическое решение :-))

  2. Сделайте SELECT COUNT(*) над интересующими вас рядами и вычислите номер страницы каждый раз, когда отображается страница.

  3. Сделайте обычный выбор, чтобы получить набор результатов для всех строк. Теперь не загружайте строки, вызывая mysql_fetch_row или около того, но получите количество строк с mysql_num_rows. (Так как я понятия не имею, как это реализовано, я не могу сказать, эффективен он или нет. Кто знает?) Тогда я мог бы удобно перемещать указатель набора результатов. (Для mysqli есть mysql_data_seek, но родное расширение MySQL не имеет аналогичную функции. Поэтому я предполагаю, что это лишь некоторая буферизация поведение mysqli)

Может кто-нибудь сказать, как подсчитать количество строк (количество страниц) наиболее эффективно?

+0

это действительно это много работы, чтобы сделать такую ​​простую задачу с PHP? Если это так, я очень очень рад, что буду кодировать платформу .NET! – pearcewg

+0

Ничего из этого не очень много - не уверен, что вы имеете в виду pearcewg –

ответ

9

Номер 2 является наиболее распространенным узором

select count(*) from [Table] where [Expressions] 

А потом

select [Columns] from [Table] where [Expressions] limit [Pagesize] offset [Pagenum*Pagesize-Pagesize] 

Это дает полные строки для всего набора результатов, а только данные строк для текущей страницы ,

Многих структуры или CMSes имеет соглашение для кэширования отдельных частей этих данных в сессии, которые вы можете или не хотите, чтобы сделать в зависимости от того вы ожидали размеры таблиц, летучесть данных и т.д.

+0

+1 Это также единственный метод, который позволяет изменять количество номеров элементов на странице. Плюс это без проблем, или так я думал. – da5id

3

Если вы действительно хотели что-то в истинно пропорциях WTF, вы всегда можете отслеживать, сколько строк было, увеличив некоторый регистр с помощью триггера для вставки/удаления.

Но я думаю, что это ответ, требующий еще большего количества вопросов;).

Просто используйте SELECT COUNT, если вам нужно. Если он медленный, это означает, что ваша база данных строится неправильно.

Кроме того, у меня есть ощущение, что здесь преждевременная оптимизация. Не оптимизируйте преждевременно. Сделайте это разумным, а затем сделайте это лучше. Имеют смысл?

0

Если я правильно понимаю, в большинстве систем, над которыми я работал, мне нужно количество страниц одновременно с захватом нового набора строк для страницы. Это позволяет отображать «page N of M» или что-то подобное в качестве заголовка и экран, полный записей.

Это зависит от базы данных, но обычно вы передаете номер текущей страницы (или номер строки), затем выполните «ограниченный запрос» (fetchsize, top и т. Д.), Чтобы получить следующий набор строк и общий номер страницы. Конечно, он становится уродливым, если количество строк меняется под ним, но я обычно об этом не беспокоюсь.

Paul.

0

Я думаю, что вы хотите создать свою навигацию вокруг одного SQL-запроса, который только изменяет ключевое слово LIMIT. Например, SELECT * FROM myTable LIMIT 0,20 вернет первые 20 строк. В вашем скрипте PHP для страницы 2 вы затем установите SQL-запрос как SELECT * FROM myTable LIMIT 20,40, возвращая тем самым строки от 20 до 40. Это то, что вы искали?

Навигацию можно создать с помощью PHP-скрипта, просто сделав выбор COUNT (*)/rowsPerPage и таким образом зацикляв структуру кода до тех пор, пока вы не встретите общее количество строк. Тогда конечный запрос будет LIMIT для lastLimit, TotalRowCount.

Редактировать: чтобы вычислить, сколько страниц вам нужно вычислить для всех строк, вам нужно определить, сколько строк может иметь страница 1. Вы бы тогда сделать TotalRows/MaxPerPage = howManyPagesNeeded

0

2 Вопросы для рассмотрения в данном контексте:

  • как обрабатывать данные, которые получает обновленные/вставленные в то время как вы читаете?
  • Сколько одновременных пользователей будет просматривать данные, и сможет ли приложение отслеживать трафик при динамическом извлечении данных?

В зависимости от ответов некоторые другие ответы здесь могут применяться или не применяться.

-2

На самом деле, если вы заполнения веб-страницу с PHP, то проще просто получить таблицу MySQL, поместить данные в массив и использовать для цикла идти Повсеместно данных, как это

for($i=0;$i<count($arrayvar);$i++){} 

С помощью простого механизма шаблонов вы можете объявить блок внутри другого блока и проанализировать все данные в одной консетной строке.

Надеюсь, это тот тип ответа, который вы ищете. Я не совсем понимаю, о чем вы говорите по своему вопросу, но я думаю, что так оно и есть.

0

Возможно, вы захотите проверить вопрос this, он очень похож на то, что вы просите.

0

Хороший способ сделать это состоит в использовании SQL_CALC_FOUND_ROWS

Пример:

SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10; 
SELECT FOUND_ROWS(); 

Даже если вы ограничиваете запрос на 10 результатов, второй запрос будет возвращать фактические общие строки, которые будут иметь были возвращены, если бы вы не использовали лимит.

Важно отметить, что FOUND_ROWS() не надежна при использовании репликации базы данных в MySQL

Смежные вопросы