2012-06-01 12 views
6

Por el momento me quedo dos consultas de MySQL para manejar mi paginación ...El uso eficaz de paginación y MySQL consulta

consulta 1 selecciona todas las filas de una tabla, así que sé cuántas páginas tengo que enumerar.

Consulta 2 selecciona las filas de la página actual (por ejemplo, las filas 0 a 19 (LÍMITE 0, 19) para la página 1, las filas 20-39 para la página dos, etc., etc.).

Parece una pérdida de dos consultas duplicadas con la única diferencia de que es la parte LIMIT.

¿Cuál sería una mejor manera de hacer esto?

¿Debo usar PHP para filtrar los resultados después de que se haya ejecutado una consulta?

Editar: ¿Debo ejecutar una consulta y usar algo como array_slice() para solo enumerar las filas que quiero?

+0

¿Está buscando algo como esto: http://stackoverflow.com/questions/802373/how-to-count-and-limit-record -in-a-single-query-in-mysql –

+0

Interesante, las respuestas en esa publicación sugieren usar dos consultas en lugar de ese supuesto "hack" ... Hmmm ... –

+0

¿No estás usando count() en q1? ¿Por qué? – Teson

Respuesta

3

La mejor manera de & es utilizar 2 consultas MYSQL para paginación (como ya lo está usando), para evitar demasiados dolores de cabeza debe simplificar la consulta utilizada para conocer el número total de filas seleccionando solo una columna (por ejemplo la clave principal) eso es suficiente. SELECT * FROM sampletable WHERE condition1>1 AND condition2>2 para paginar dicha consulta puede utilizar estas dos consultas SELECT * FROM sampletable WHERE condition1>1 AND condition2>2 LIMIT 0,20 SELECT id FROM sampletable WHERE condition1>1 AND condition2>2

+0

Eso es lo que dice OP. Él no quiere dolor de cabeza de disparar 2 consultas.Él quiere recuento total de filas y resultados limitados en una sola consulta. Ver mi solución. –

0

Uso FOUND_ROWS()

instrucción SELECT puede incluir una cláusula LIMIT para restringir el número de registros que el servidor devuelve al cliente. En algunos casos, es deseable saber cuántas filas habría devuelto la instrucción sin el LÍMITE, pero sin ejecutar nuevamente la instrucción. Para obtener este número de filas, incluir una opción SQL_CALC_FOUND_ROWS en la instrucción SELECT, y luego invocar FOUND_ROWS() después:

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

El segundo SELECT devuelve un número que indica cuántas filas habría devuelto el primer SELECT si se hubiera escrito sin la cláusula LIMIT.

Tenga en cuenta que esto ejerce una presión adicional en la base de datos, ya que tiene que averiguar el tamaño del conjunto de resultados completo cada vez. Use SQL_CALC_FOUND_ROWS solo cuando lo necesite.

+1

found_rows() es una idea terrible, especialmente porque SQL_CALC_FOUND_ROWS buscará todas las filas aunque solo desee las primeras 20 filas. Así que, básicamente, su búsqueda de x número de registros, mientras que realmente quiere 20 o más registros. si x está en millones y tu consulta tiene muchas combinaciones, ¡mantendrás a tu usuario esperando durante mucho tiempo! –