/ / Paginare con Coldfusion - mysql, coldfusion, impaginazione, paginare

Impaginazione con Coldfusion - mysql, coldfusion, impaginazione, paginate

È possibile impaginare e visualizzare il numero di pagine in Coldfusion usando una sola query?

La mia comprensione è che puoi ovviamente impaginare con una query, ma avresti bisogno di una query aggiuntiva per creare le pagine. Questo è per calcolare il numero totale di risultati.

(currentPage - 1) * resultsPerPage = Offset in MySQL query. Questa logica è sufficiente per creare i pulsanti next / prev. Ma per conoscere il numero di pagine, non avremmo bisogno di conoscere il numero totale di risultati utilizzando una query separata, quindi una query di query per i dati?

risposte:

2 per risposta № 1

Sì, il tipico metodo basato su mysql richiede due query: una con select count(*) from table, secondo con select a, b, c from table limit x,y dove x e y sono costruiti a seconda della pagina corrente e dell'offset necessario.

Con una singola query è necessario selezionare tutti i record, il che è un approccio meno efficiente in maggior parte casi.


3 per risposta № 2

In MS SQL, usa CTE:

ricevere gli argomenti @startRow e @endRow più gli argomenti necessari

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 per risposta № 3

Non ho tanta familiarità con MySQL, ma so che in MS SQL una stored procedure può restituire più set di risultati.

Se non puoi farlo, ci sono i due modi che hai suggerito, ma il secondo può essere ottimizzato.

Innanzitutto, esegui due query. Uno per ottenere i dati per la pagina attualmente visualizzata, uno per ottenere la dimensione totale del set di risultati. Questo è quello che farei se i dati cambiano frequentemente o se di solito non vengono visualizzate più pagine. Ciò richiede due chiamate DB, ma riduce la dimensione totale del reso. Se non si cambiano i dati freqauently, ma raramente si utilizzano più di poche pagine per query, è anche possibile memorizzare nella cache il conteggio totale dei risultati.

Il secondo è quello di restituire tutti i risultati in un unico grandequery e visualizza solo la pagina appropriata. Non è necessaria una query di query, poiché i cicli di query che utilizzano cfloop e cfoutput possono specificare le righe di query iniziali e finali. Se si esegue questa operazione, memorizzo nella cache la query, che utilizza più memoria e il primo caricamento della pagina sarà più lento, ma avrai un caricamento veloce della pagina nelle pagine successive.


2 per risposta № 4

È possibile utilizzare semplicemente CFGrid per visualizzare l'intero set di risultati. L'impaginazione viene cotta. Ecco un link ai documenti: http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7baf.html


2 per risposta № 5

Quello che ho fatto è fare la query "grande" ememorizzare i risultati nell'ambito SESSION, quindi eseguire query di query su ogni pagina. Meno chiamate al database, che di solito è dove i colli di bottiglia sono comunque.


2 per risposta № 6

Questo è in genere come lo faccio. Puoi selezionare il conteggio della tabella facendo una sottoselezione e aliasandola. Puoi vederlo come la terza colonna in questa query. Questo potrebbe essere usato anche per prendere i dati da un altro tavolo, se lo si desidera. fa sì che MySQL avvii un'altra query nel mezzo della tua query per assemblare i dati, ma coldfusion ha solo bisogno di chiedere al database una volta che lo rende più veloce di 2 query separate.

    <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 per risposta № 7

Credo che tu possa fare:

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

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

Con la tua impaginazione appropriata in attosulla seconda query. Otterrai il conteggio su ogni record nel set restituito, ma non è un grosso problema. Non ho provato questo però, non ho MySQL.


1 per risposta № 8

mentre questo non è il modo migliore per farlo, è la vecchia scuola.

puoi farlo usando 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>

ora per essere onesti ... questo metodo fa schifo ed è VERAMENTE lento per le grandi richieste. personalmente io uso CFWheels questo ha tutte queste cose incorporato in esso ORM.


1 per risposta № 9

In uso MySQL SQL_CALC_FOUND_ROWS. Per esempio:

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

Subito dopo la query di query di nuovo per:

SELECT FOUND_ROWS() AS TotalRows

Usando la direttiva SQL_CALC_FOUND_ROWS fa sì che MySQL memorizzi il numero totale di righetrovato per l'ultima query prima di applicare il limite e l'intervallo. Questo è lo stesso di fare un conteggio () sulla stessa query senza il sovraccarico di dover effettivamente contare, quindi interrogare, limitare la query.

Racchiudere le due chiamate DB in una transazione per garantireeseguono consecutivamente. Si potrebbe anche pensare di astrarre le query in una funzione che eseguirà entrambe e restituire una singola struttura con una chiave dei risultati e un totale di righe. Usa i risultati come sopra citato per generare link di paginazione come meglio credi.