Пагинация с помощью Coldfusion - PullRequest
2 голосов
/ 29 июля 2010

Можно ли разбить на страницы и отобразить количество страниц в Coldfusion, используя только один запрос?

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

(currentPage - 1) * resultsPerPage = Offset in MySQL запрос.Этой логики достаточно для создания кнопок «следующий / предыдущий».Но чтобы узнать количество страниц, не нужно ли нам знать общее количество результатов, используя отдельный запрос, а затем запрос запросов данных?

Ответы [ 9 ]

3 голосов
/ 29 июля 2010

В MS SQL используйте CTE:

получите аргументы @startRow и @endRow плюс необходимые аргументы

WITH qTemp AS (
   select *
   ,   count(*) as totCnt
   ,   rowNum = ROW_NUMBER() OVER(ORDER BY myIndex ASC)
   from myTable
   where (my where clause)
)
SELECT * FROM qTemp
WHERE rowNum BETWEEN @startRow AND @endRow
2 голосов
/ 16 января 2014

Обычно я так делаю.Вы можете выбрать количество таблиц, выполнив дополнительный выбор и присвоив ему псевдонимы.Вы можете видеть это как третий столбец в этом запросе.Это может быть использовано, чтобы даже получить данные из другой таблицы, если вы хотите.это приводит к тому, что MySQL инициирует другой запрос в середине вашего запроса для сбора данных, но Coldfusion нужно только запросить базу данных, сделав ее быстрее, чем 2 отдельных запроса.

2 голосов
/ 29 июля 2010

Что я сделал, так это выполнил «большой» запрос и сохранил результаты в области SESSION, а затем выполнил запрос на каждой странице. Меньше обращений к базе данных, которая обычно является узким местом в любом случае.

2 голосов
/ 29 июля 2010

Вы можете просто использовать CFGrid для отображения всего набора результатов.Нумерация страниц запеченная.Вот ссылка на документы: http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7baf.html

2 голосов
/ 29 июля 2010

Я не очень знаком с MySQL, но знаю, что в MS SQL хранимая процедура может возвращать несколько наборов результатов.

Если вы не можете сделать это, вы можете предложить два способа, но второй может быть оптимизирован.

Сначала запустите два запроса. Один для получения данных для текущей отображаемой страницы, другой для получения общего размера набора результатов. Это то, что я сделал бы, если данные часто изменяются, или если несколько страниц обычно не отображаются. Это требует двух вызовов дБ, но уменьшает общий размер возврата. Если вы не изменяете данные часто, но редко используете более нескольких страниц на запрос, вы также можете кэшировать общее количество результатов.

Второй - вернуть все результаты в одном большом запросе и отобразить только соответствующую страницу. Здесь вам не нужен запрос запросов, так как запрос зацикливается с использованием cfloop и cfoutput и может указывать начальную и конечную строки запроса. Если вы сделаете это, я бы кешировал запрос. При этом используется больше памяти, и загрузка первой страницы будет медленнее, но вы будете иметь быструю загрузку страниц на последующих страницах.

2 голосов
/ 29 июля 2010

Да, типичный метод на основе mysql требует два запроса: один с select count(*) from table, второй с select a, b, c from table limit x,y, где x и y строятся в зависимости от текущей страницы и необходимого смещения.

В одном запросе вам нужно выбрать все записи, что менее эффективно в большинстве случаев.

1 голос
/ 17 декабря 2013

В MySQL используйте SQL_CALC_FOUND_ROWS. Например:

SELECT SQL_CALC_FOUND_ROWS * FROM tbl WHERE x = y LIMIT s,m

Сразу после запроса снова:

SELECT FOUND_ROWS() AS TotalRows

Использование директивы SQL_CALC_FOUND_ROWS заставляет MySQL хранить общее количество строк, найденных для последнего запроса, перед применением ограничения и диапазона. Это то же самое, что выполнять Count () для одного и того же запроса без дополнительных затрат на то, чтобы фактически считать, а затем запросить, а затем ограничить запрос.

Оберните два вызова базы данных в транзакции, чтобы убедиться, что они выполняются последовательно. Вы также можете подумать о том, чтобы абстрагировать запросы в функцию, которая будет выполнять оба действия и возвращать одну структуру с ключом результатов и ключами общих строк. Используйте результаты, приведенные выше, для создания ссылок на страницы по своему усмотрению.

1 голос
/ 30 июля 2010

, хотя это не ЛУЧШИЙ способ сделать это, это способ старой школы.

Вы можете сделать это с помощью cfoutput.

<cfquery name="q" dsn="#application.dsn">
SELECT
  firstname,
  lastname
FROM
  mytable
WHERE
  <some conditions>
</cfquery>

<cfparam name="url.maxrows" default="50">
<cfset url.maxrows = fix(val(url.maxrows))>
<cfparam name="url.startrow" default="1">
<cfset url.startrow = fix(val(url.startrow))>
<cfif url.startrow lte 0>
  <cfset url.startrow = 1>
</cfif>
<cfif url.startrow gte q.recordcount>
  <cfset url.startrow = q.recordcount>
</cfif>

<cfoutput>Total Records: #q.recordcount#/<cfoutput>

<cfoutput query="q" maxrows="#url.maxrows#" startrow="#url.startrow#">
  #firstname#<br/>#lastname#
</cfoutput>

<p>Page: 
<cfloop from="1" to="#q.recordcount#" step="#url.maxrows#" index="i">
  <a href="#cgi.script_name#?startrow=#i#&maxrows=#url.maxrows">#(i / url.maxrows)#</a>
</cfloop>
</p>

теперь, если честно ... этот метод отстой и ДЕЙСТВИТЕЛЬНО медленен для больших запросов. лично я использую CFWheels , в котором все это встроено в ORM .

1 голос
/ 30 июля 2010

Я верю, что вы можете сделать:

SET @myCount = (SELECT COUNT(*) FROM tblName);

SELECT col1, col2, @myCount as 'total'
FROM tblName

При наличии соответствующего материала для разбивки на страницы во втором запросе. Вы получите счет на каждой записи в вашем возвращенном наборе, но это не так уж важно. Я не проверял это, хотя, у меня нет MySQL.

...