Programación en castellano
Inicio > Taller PHP > Paginar los resultados de una consulta en PHP (III)
-Artículos

Paginar los resultados de una consulta en PHP (III)

1 . Consulta con SQL_CALC_FOUND_ROWS
2 . Script

MySQL 4 dispone de una función que nos permite evitarnos los problemas de rendimiento que poseían las dos soluciones que hemos visto hasta el momento. Aunque tendremos que hacer dos consultas, la primera devolverá sólo los registros que deseemos mostrar y la segunda será simplemente una llamada a una función, que nos devolverá el número de registros totales que habría devuelto la consulta si no le hubiesemos puesto unos límites.

Consulta con SQL_CALC_FOUND_ROWS

La función de MySQL FOUND_ROWS() devuelve el número de filas que hubiese devuelto la última consulta si no hubiera tenido un LIMIT. Sin embargo, MySQL está optimizado para dejar de examinar registros cuando ya se han encontrado los que debe devolver. Por tanto, dado que realizar ese cálculo conllevará necesariamente un sobreprecio en tiempo de proceso, por defecto las consultas no lo realizan. Para obligarlas se utiliza SQL_CALC_FOUND_ROWS:

SELECT SQL_CALC_FOUND_ROWS * FROM tabla;

De este modo, el total lo podremos obtener con la siguiente consulta:

SELECT FOUND_ROWS();

Script

Supongamos que tenemos la función paginar, que ya completamos en el anterior artículo sobre paginación. Haremos primero la consulta con SQL_CALC_FOUND_ROWS y un límite para que sólo devuelva los registros que necesitamos. Si devuelve algún registro, será el momento de hacer una segunda consulta para averiguar el número total de registros:

<html> 
<body> 
<?php 
$link = mysql_connect("localhost", "nobody"); 
mysql_select_db("mydb", $link); 
if (!isset($pag)) $pag = 1; // Por defecto, pagina 1
$tampag = 10;
$reg1 = ($pag-1) * $tampag;
$result = mysql_query("SELECT SQL_CALC_FOUND_ROWS
  nombre, apellidos FROM clientes", $link); 
if (mysql_num_rows($result)){ 
  $result2 = mysql_query("SELECT FOUND_ROWS()", $link);
  list($total) = @mysql_fetch_array($result2);
  echo "<table border = '1'> \n"; 
  echo "<tr><td>Nombre</td><td>Apellidos</td></tr> \n";
  while ($row = @mysql_fetch_array($result)) { 
    echo "<tr><td>".$row["nombre"].
      "</td><td>".$row["email"]."</td></tr> \n"; 
  }
  echo "</table> \n"; 
  echo paginar($pag, $total, $tampag, "clientes.php?pag=");
}
else
  echo "¡ No se ha encontrado ningún registro !";
?>

De este modo tendremos el mínimo sobreprecio posible por paginar nuestras consultas.

 

Últimos comentarios
Últimos 5 comentarios

Paginar y ordenar ? (06/06/2007)

Por
Los 3 ejemplos de paginar van muy bien.

El prb lo tienes si en la pagina que muestras el resultado añades algun criterio de filtrado y/o una condicion para ordenar ?

Como canvias la variable $enlace para que tenga en cuenta estos criterios ?

Un saludo y gracias

Por qué no así?: (01/08/2006)

Por
$query=\"SELECT Count(*) AS total FROM people\";
$count=mysql_query($query) or die(mysql_error());
$row=mysql_fetch_row($count);
$total=$row[0];

$total me da el numero total de campos de la tabla people. Es tan solo utilizar el \"Count\" de toda la vida de SQL

Versión SQL (29/05/2006)

Por
Esta función está hecha para conseguir la cantidad total de registros aun cuando haya un LIMIT en el query. Esto es mucho más rápido que verificar en PHP. También es importante saber que esta función está habilitada en MySQL 5.0 que no es aún una versión estable, no es recomendable usarla si no se tiene un servidor o con el permiso de instalación.

Falta el LIMIT en la consulta (24/04/2006)

Por
El articulo es muy bueno, hay que leerse los 3 articulos de paginar consultas para ver las mejoras, nobstante falta la clausa LIMIT en la query SELECT ya que sino bueno pues haces un SQL_CALC_FOUND_ROWS pero siempre vas ha estar pidiendo todos los registros en cada pagina por que no hay clausula de limitacion, asi que en cuanto a efectividad no avanzas nada sino colocas la clausula LIMIT. Tal y como dice la documentacion de MySQL solo tiene sentido hacer el SQL_CALC_FOUND_ROWS en caso de tener una restriccion del resultado por una clausula LIMIT documento de MySQL (http://dev.mysql.com/doc/refman/5.0/en/information-functions.html):
SQL_CALC_FOUND_ROWS and FOUND_ROWS() can be useful in situations when you want to restrict the number of rows that a query returns, but also determine the number of rows in the full result set without running the query again. An example is a Web script that presents a paged display containing links to the pages that show other sections of a search result. Using FOUND_ROWS() allows you to determine how many other pages are needed for the rest of the result.
Así que es importante poner el LIMIT en la query SELECT por que sino no tiene mucha utilidad, ya que siempre vas a estar cargando todos los registros de la tabla o tablas, claro que funcionara el SQL_CALC_FOUND_ROWS, pero sigue siendo igual de ineficiente que el segundo articulo.
Tambien hay que destacar que para uniones complejas no funciona bien el SQL_CALC_FOUND_ROWS:
The use of SQL_CALC_FOUND_ROWS and FOUND_ROWS() is more complex for UNION statements than for simple SELECT statements, because LIMIT may occur at multiple places in a UNION. It may be applied to individual SELECT statements in the UNION, or global to the UNION result as a whole.
Pero si pones parentesis entre los union si que devuelve un resultado correcto.
Bien eso es todo, y buen articulo. Y sobretodo no os olvideis de la clausula LIMIT ;)

Sobre el Resultado incorrecto (24/04/2006)

Por
Carlos T. no puedes hacer:
$total = mysql_query(\"SELECT FOUND_ROWS()\");
así alegremente!!!!!
tienes que hacer:
$result = mysql_query(\"SELECT FOUND_ROWS()\");
$row=mysql_fetch_row($result);
$total=$row[0];

Se trata como si fuera un SELECT tipico, cuando tu haces mysql_query te devuelve un resource. Mira la especificacion de cualquier funcion en www.php.net, aquí te dejo la de mysql_query:
resource mysql_query ( string query [, resource identificador_de_enlace] )
Por lo tanto tienes que coger ese Resource que es lo que a ti te da \'Resource id #5\' y pedirle a ese Resource que te devuelva en este caso la primera fila y unica para esta consulta select con \'$row=mysql_fetch_row($result);\' una vez te devuelta la columan en $row en el primer campo el $row[0] tiene el resultado del total de filas o tuplas de la consulta anteriormente ejecutada.
 
Tienda
Patrocinados
 

Copyright © 1999-2007 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad

Hospedaje web y servidores dedicados linux por Ferca Network

red internet: musica mp3 | logos y melodias | hospedaje web linux | registro de dominios | servidores dedicados
más internet: comprar | recursos gratis | posicionamiento en buscadores | tienda virtual | gifs animados