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
Estás leyendo “Me encanta SELECT FOUND_ROWS()”, de Quenerapú
- Publicado:
- 22|06|2009 a las 12:51h.
- Etiquetas:
- found_rows(), select, sql_calc_found_rows
5 comentarios
Añadir comentario | comments rss [?] | trackback uri [?]