Me encanta SELECT FOUND_ROWS()

Muchas veces necesito paginar el resultado de una consulta mySQL.

SELECT * FROM tapas WHERE meGusta=true

Esto daría más de 200 resultados (soy un goloso)

Tengo una función para paginar (ya escribiré sobre ella más adelante) pero hoy quiero rendir homenaje a la imprescindible función de mySQL SELECT FOUND_ROWS().

Supongamos que quiero paginar un listado de más de 200 resultados. Ya tengo claro que quiero mostrar 25 registros por página así que añado a la consulta SELECT la cláusula LIMIT

SELECT * FROM tapas WHERE meGusta=true ORDER BY importancia LIMIT 0,25

Y así, vale, listo los 25 primeros y luego con

SELECT * FROM tapas WHERE meGusta=true ORDER BY importancia LIMIT 25,25

listo los 25 siguientes y así consecutivamente, pero: ¡quiero paginarlo! Quiero saber de antemano cuántos van a ser en total y poder calcular así cuántas páginas necesitaré.

A priori parece inevitable hacer antes de nada una consulta con SELECT COUNT para hacer el recuento y luego la consulta SELECT ‘oficial’, pero advierto: *este no es el camino*.

<?php
// Primer SELECT sólo para contar el total
$q = mysql_query("SELECT COUNT(*) AS rt FROM tapas WHERE meGusta=true");
$r = mysql_fetch_array($q);
$rp = 25; // Resultados por página
$rt = $r[rt]; // Total de registros
$tp = $rt/$rp; // Total de páginas

// Segundo SELECT para generar el listado
$p = isset($_GET['p'] && $_GET['p']<=$tp)?$_GET['p']:0; // A qué página vamos
$q = mysql_query("SELECT * FROM tapas WHERE meGusta=true ORDER BY importancia LIMIT ".$p*$rp.",".$rp);
while($r=mysql_fetch_array($q))
	{
//	bla, bla, bla...
	}
?>

Pero NO. No debemos hacerlo así. Estaríamos consumiendo recursos inútilmente. Para esto tenemos el dúo SELECT SQL_CALC_FOUND_ROWS y SELECT FOUND_ROWS()

Este SÍ es el camino

<?php
// Todo con un único SELECT
$rp = 25; // Resultados por página
$p = (isset($_GET['p']) && $_GET['p']<=$tp)?$_GET['p']:0; // A qué página vamos
$q = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM tapas WHERE meGusta=true ORDER BY importancia LIMIT ".$p*$rp.",".$rp);
$rt = mysql_fetch_row(mysql_query("SELECT FOUND_ROWS()")); // Total de registros
$tp = $rt[0]/$rp; // Total de páginas
echo "<ul>";
while($r=mysql_fetch_array($q))
	{
	echo "<li>$r[tapa]</li>;
	}
echo "</ul>";
?>

Acerca de esta entrada