Domanda

Spero di non scrivere un duplicato, ma non ho trovato nulla che risponda alla mia domanda. (Anche se mi sembra un problema abbastanza comune.)

Il problema si verifica in quasi tutti i progetti Web: si dispone di una tabella con molte voci e si desidera che vengano visualizzate su singole pagine.

Ora mi chiedo quale sia il modo migliore per calcolare il numero di pagine necessarie per un determinato set di righe di tabella.

Ecco alcuni approcci a cui ho pensato. Mi piacerebbe avere qualche risposta su quanto siano efficaci. Fornirò esempi specifici di PHP, ma scommetto che ci sono tecniche simili in altre lingue.

  1. Il modo probabilmente migliore è salvare staticamente il numero di pagine e modificarne il valore ogni volta che viene aggiunta una nuova voce. (Tuttavia ... sto cercando una soluzione dinamica :-))

  2. Esegui un SELEZIONA COUNT (*) sulle righe di interesse e calcola il numero di pagina ogni volta che viene visualizzata la pagina.

  3. Esegui una normale selezione per ottenere un set di risultati per tutte le righe. Ora non caricare le righe chiamando mysql_fetch_row o giù di lì, ma ottieni il numero di righe con mysql_num_rows . (Dato che non ho idea di come questo sia implementato, non posso dire se sia efficace o no. Chiunque lo sappia?) Quindi potrei spostare comodamente il puntatore del set di risultati. (Per mysqli c'è mysql_data_seek , ma l'estensione MySQL nativa non ha una funzione simile. Quindi presumo che questo sia solo un comportamento di buffering di mysqli )

Qualcuno può dire come contare il numero di righe (numero di pagine) in modo più efficace?

È stato utile?

Soluzione

Il numero 2 è il modello più comune

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

E poi

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

Questo ti dà il totale delle righe per l'intero set di risultati, ma solo i dati delle righe per la pagina corrente.

Molti framework o CMS hanno convenzioni per la memorizzazione nella cache di alcune parti di questi dati nella sessione che potresti o non vuoi fare a seconda delle dimensioni previste della tabella, della volatilità dei dati, ecc.

Altri suggerimenti

Se volessi davvero qualcosa di veramente proporzioni WTF, potresti sempre tenere traccia di quante righe c'erano aumentando alcuni registri usando un trigger su insert / delete.

Ma penso che questa sia una risposta che richiede ancora altre domande;).

Basta usare SELEZIONA COUNT se è necessario. Se è lento, ciò significa che il tuo database è di solito sbagliato.

Inoltre, ho la sensazione che qui ci sia un'ottimizzazione prematura. Non ottimizzare prematuramente. Dagli un senso e poi dai un senso al meglio. Ha senso?

Se ho capito bene, nella maggior parte dei sistemi su cui ho lavorato ho avuto bisogno del numero di pagine contemporaneamente mentre sto afferrando un nuovo set di righe per una pagina. Ciò consente una visualizzazione di "pagina N di M" o qualcosa del genere come titolo e uno schermo pieno di voci.

Dipende dal database, ma di solito passi il numero current_page (o il numero di riga), quindi esegui una "query limitata" (fetchsize, top, ecc.) per ottenere il prossimo set di righe e un numero di pagina totale. Concesso diventa brutto se il numero di righe sta cambiando sotto, ma di solito non me ne preoccupo.

Paul.

Penso che tu voglia costruire la tua navigazione attorno a una singola query SQL che modifica solo la parola chiave LIMIT. Ad esempio SELEZIONA * DA myTable LIMIT 0,20 restituirà le prime 20 righe. Nel tuo script PHP per pagina 2 imposterai quindi la query SQL su SELECT * FROM myTable LIMIT 20,40 restituendo così le righe da 20 a 40. È questo quello che stavi cercando?

La navigazione può essere costruita con il tuo script PHP semplicemente facendo un COUNT selezionato (*) /owsPerPage e quindi eseguendo il ciclo di una struttura di codice fino a raggiungere il numero totale di righe. La query finale dovrebbe quindi LIMITARE a lastLimit, TotalRowCount.

Modifica: per calcolare quante pagine devi calcolare tutte le righe dovresti definire quante righe può avere 1 pagina. Dovresti quindi eseguire TotalRows / MaxPerPage = howManyPagesNeeded

2 domande da considerare in questo contesto:

  • come gestire i dati che vengono aggiornati / inseriti durante la visualizzazione?
  • quanti utenti simultanei visiteranno i dati e l'applicazione sarà in grado di tenere il passo con il traffico quando recupera le pagine di dati in modo dinamico?

A seconda delle risposte, alcune delle altre risposte qui possono o meno essere applicabili.

Potresti voler dare un'occhiata a questa domanda, è molto simile a quello che stai chiedendo.

Un buon modo per farlo è usare SQL_CALC_FOUND_ROWS

Esempio:

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

Anche se stai limitando la query a 10 risultati, la seconda query restituirà le righe totali effettive che sarebbero state restituite se non avessi utilizzato un limite.

È importante notare che FOUND_ROWS () non è affidabile quando si utilizza la replica del database MySQL

In realtà, se stai riempiendo una pagina web con PHP, è più semplice ottenere la tabella MySQL, mettere i dati in un array e usare un for-loop per esaminare i dati in questo modo

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

Con anche un semplice motore di template, puoi dichiarare un blocco all'interno di un altro blocco e analizzare tutti i dati in una riga consequtive.

Spero che sia il tipo di risposta che stai cercando. Non sono molto chiaro su cosa intendi con la tua domanda, ma penso che sia così.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top