Paginar los resultados de una consulta en PHP (III)

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'> 
"; 
  echo "<tr><td>Nombre</td><td>Apellidos</td></tr> 
";
  while ($row = @mysql_fetch_array($result)) { 
    echo "<tr><td>".$row["nombre"].
      "</td><td>".$row["email"]."</td></tr> 
"; 
  }
  echo "</table> 
"; 
  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.

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
SIGUIENTE ARTÍCULO

¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.