/ / Paginating с ColdFusion - mysql, coldfusion, pagination, paginate

Пагинация с ColdFusion - mysql, coldfusion, pagination, paginate

Възможно ли е да се разделят и показват страници в Coldfusion само с една заявка?

Моето разбиране е, че очевидно може да се раздели с една заявка, но ще ви е необходима допълнителна заявка, за да създадете страниците. Това е, за да се изчисли общият брой резултати.

(currentPage - 1) * resultsPerPage = Offset in MySQL запитване. Тази логика е достатъчна за създаване на бутони следващ / предишен. Но за да знаем броя на страниците, не би ли трябвало да знаем общия брой на резултатите, използвайки отделна заявка, а след това заявка за заявки за данните?

Отговори:

2 за отговор № 1

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

С едно запитване ще трябва да изберете всички записи, което е по-малко ефективен подход най-много случаи.


3 за отговор № 2

В 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 за отговор № 3

Нямам толкова много познания за MySQL, но знам, че в MS SQL съхранената процедура може да върне множество множества от резултати.

Ако не можете да направите това, има два начина, които сте предложили, но вторият може да бъде оптимизиран.

Първо, изпълнете две заявки. Един за получаване на данните за текущо показаната страница, една за получаване на общия размер на резултатите. Това е, което бих направил, ако данните се променят често, или ако обикновено не се показват няколко страници. Това изисква две обаждания в db, но намалява общия размер на връщането. Ако не променяте данните, но рядко използвате повече от няколко страници на заявка, можете също да кеширате общия брой резултати.

Вторият е да се върнат всички резултати в един голямзапитване и показва само съответната страница. Тук не се нуждаете от заявка за заявки, тъй като циклите на заявките с cfloop и cfoutput могат да задават начални и крайни редове на заявки. Ако направите това, ще кеширам заявката. по-бавно, но ще имате бързо зареждане на страници на следващите страници.


2 за отговор № 4

Можете просто да използвате CFGrid за показване на целия резултат. Разпечатката е изпечена. Ето линк към документите: http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7baf.html


2 за отговор № 5

Това, което направих, е да направя „голямата“ заявка исъхранявайте резултатите в обхвата на SESSION, след това направете заявка за заявка на всяка страница. По-малко повиквания към базата данни, което обикновено е мястото, където тесните места са все пак.


2 за отговор № 6

Обикновено това е как го правя. Можете да изберете броя на таблицата, като направите под-селекция и я присвоите. Можете да я видите като трета колона в тази заявка. Това би могло да се използва дори за събиране на данни от друга таблица, ако искате. това причинява MySQL да инициира друга заявка в средата на вашата заявка, за да събере данните, но coldfusion само трябва да поиска от базата данни веднъж да го направи по-бързо от 2 отделни заявки.

    <cfquery name="SomeQry" datasource="YourDatabase">
SELECT
col1,
col2,
(SELECT COUNT(*) FROM MyTable) as mycount
FROM MyTable
LIMIT #(CurrentPage * 20) - 20#, 20
</cfquery>

<cfset start = CurrentPage - 5>
<cfset Max = CurrentPage + 5>

<cfoutput>
<ul class="pagination">
<cfloop from=#start# to=#Max# index="page">
<li><a href="/search?q=#querystring#&page=#page#">#page#</a></li>
</cfloop>
</ul>
</cfoutput>

1 за отговор № 7

Вярвам, че можете да направите:

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

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

С подходящите неща за страниране на мястоза втората заявка. Ще получите броя на всеки запис във върнатия ви комплект, но това не е голяма работа. Не проверих това обаче, нямам MySQL.


1 за отговор № 8

докато това не е най-добрият начин да направите това, това е начинът на старото училище.

можете да постигнете това, като използвате 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 че има всички тези неща вграден в него.


1 за отговор № 9

В 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 () на една и съща заявка, без да се налага да преброявате, а след това да подавате заявка, а да ограничите заявката.

Увийте двата обаждания в една транзакция, за да се уверитете изпълняват последователно. Можете също така да помислите за абстракцията на заявките във функция, която ще направи и двете, и ще върне една структура с ключове с резултати и общи редове. Използвайте резултатите, цитирани по-горе, за да генерирате връзки на страници, както смятате за подходящи.