Pregunta

Espero no escribir un duplicado, pero no he encontrado nada que responda a mi pregunta. (Aunque me parece un problema bastante común).

El problema ocurre en casi todos los proyectos web: tiene una tabla con muchas entradas y desea que se muestren en páginas individuales.

Ahora me pregunto cuál es la mejor manera de calcular la cantidad de páginas necesarias para un determinado conjunto de filas de tabla.

Aquí algunos enfoques en los que he estado pensando. Me gustaría obtener alguna respuesta sobre cuán efectivos son. Daré ejemplos específicos de PHP, pero apuesto a que hay técnicas similares en otros idiomas.

  1. La mejor manera probablemente es guardar el número de páginas de forma estática y modificar el valor cada vez que se agrega una nueva entrada. (Sin embargo ... estoy buscando una solución dinámica :-))

  2. Haga un SELECT COUNT (*) sobre las filas de interés y calcule el número de página cada vez que se muestra la página.

  3. Haga una selección ordinaria para obtener un conjunto de resultados para todas las filas. Ahora no cargue las filas llamando a mysql_fetch_row más o menos, sino que obtenga el número de filas con mysql_num_rows . (Como no tengo idea de cómo se implementa esto, no puedo decir si es efectivo o no. ¿Alguien que lo sepa?) Entonces podría mover cómodamente el puntero del conjunto de resultados. (Para mysqli hay mysql_data_seek , pero la extensión MySQL nativa no tiene una función similar. Por lo tanto, supongo que esto es solo un comportamiento de búfer de mysqli )

¿Alguien puede decir cómo contar el número de filas (número de páginas) de manera más efectiva?

¿Fue útil?

Solución

El número 2 es el patrón más común

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

Y luego

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

Esto le da el total de filas para todo el conjunto de resultados, pero solo los datos de las filas para la página actual.

Muchos frameworks o CMS tienen convenciones para almacenar en caché ciertas partes de estos datos en la sesión que puede o no querer hacer dependiendo de los tamaños de tabla esperados, la volatilidad de los datos, etc.

Otros consejos

Si realmente quisiera algo de verdaderas proporciones WTF, siempre podría realizar un seguimiento de cuántas filas había incrementando algún registro utilizando un disparador al insertar / eliminar.

Pero creo que esta es una respuesta pidiendo aún más preguntas;).

Solo usa SELECT COUNT si es necesario. Si es lento, eso significa que su base de datos está mal construida por lo general.

Además, tengo la sensación de que hay una optimización prematura arrastrándose aquí. No optimices prematuramente. Haz que tenga sentido, y luego haz que tenga sentido mejor. ¿Tener sentido?

Si entiendo correctamente, en la mayoría de los sistemas en los que he trabajado he necesitado el número de páginas al mismo tiempo que estoy tomando un nuevo conjunto de filas para una página. Esto permite una visualización de " página N de M " o algo así como el título, y una pantalla llena de entradas.

Depende de la base de datos, pero generalmente pasa el número de página actual (o el número de fila), luego realiza una "consulta limitada". (fetchsize, top, etc.) para obtener el siguiente conjunto de filas y un número total de página. De acuerdo, se pone feo si el número de filas está cambiando debajo, pero generalmente no me preocupo por eso.

Paul.

Creo que desea construir su navegación alrededor de una sola consulta SQL que solo modifica la palabra clave LIMIT. Por ejemplo, SELECT * FROM myTable LIMIT 0,20 devolverá las primeras 20 filas. En su script PHP para la página 2, configurará la consulta SQL para que sea SELECT * FROM myTable LIMIT 20,40, devolviendo así filas del 20 al 40. ¿Es esto lo que estaba buscando?

La navegación se puede construir con su script PHP simplemente haciendo una selección COUNT (*) / rowsPerPage y, por lo tanto, haciendo un bucle de una estructura de código hasta que alcance el número total de filas. La consulta final entonces LIMITARía a lastLimit, TotalRowCount.

Editar: para calcular cuántas páginas necesita para calcular todas las filas que necesitaría para definir cuántas filas puede tener 1 página. Entonces haría TotalRows / MaxPerPage = howManyPagesNeeded

2 preguntas a considerar en este contexto:

  • ¿cómo manejar los datos que se actualizan / insertan mientras está viendo?
  • ¿cuántos usuarios concurrentes explorarán los datos, y la aplicación podrá mantenerse al día con el tráfico cuando recupere páginas de datos dinámicamente?

Dependiendo de las respuestas, algunas de las otras respuestas aquí pueden o no aplicarse.

Es posible que desee consultar esta pregunta, es muy similar a lo que está preguntando.

Una buena manera de hacer esto es usar SQL_CALC_FOUND_ROWS

Ejemplo:

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

Aunque limite la consulta a 10 resultados, la segunda consulta devolverá las filas totales reales que se habrían devuelto si no hubiera utilizado un límite.

Es importante tener en cuenta que FOUND_ROWS () no es confiable cuando se utiliza la replicación de bases de datos MySQL

En realidad, si está llenando una página web con PHP, es más fácil obtener la tabla MySQL, poner los datos en una matriz y usar un bucle for para recorrer los datos de esta manera

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

Incluso con un motor de plantillas simple, puede declarar un bloque dentro de otro bloque y analizar todos los datos en una línea consecutiva.

Espero que ese sea el tipo de respuesta que estás buscando. No tengo muy claro lo que quieres decir con tu pregunta, pero creo que esto es todo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top