<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Quenerapú &#187; found_rows()</title>
	<atom:link href="http://quenerapu.com/etiquetas/found_rows/feed/" rel="self" type="application/rss+xml" />
	<link>http://quenerapu.com</link>
	<description>Sentado delante de un ordenador desde 1982. ¿De qué voy a hablar, si no?</description>
	<lastBuildDate>Mon, 12 Jul 2010 09:09:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Me encanta SELECT FOUND_ROWS()</title>
		<link>http://quenerapu.com/mysql/me-encanta-select-found_rows/</link>
		<comments>http://quenerapu.com/mysql/me-encanta-select-found_rows/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 10:51:17 +0000</pubDate>
		<dc:creator>Quenerapú</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[found_rows()]]></category>
		<category><![CDATA[select]]></category>
		<category><![CDATA[sql_calc_found_rows]]></category>

		<guid isPermaLink="false">http://quenerapu.com/?p=116</guid>
		<description><![CDATA[La mejor forma de obtener el total de registros resultado de un SELECT sin tener que hacer un SELECT COUNT() previo.]]></description>
			<content:encoded><![CDATA[<p>Muchas veces necesito paginar el resultado de una consulta mySQL.</p>
<pre class="brush: sql;">
SELECT * FROM tapas WHERE meGusta=true
</pre>
<p>Esto daría más de 200 resultados (soy un goloso)</p>
<p>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 <strong>SELECT FOUND_ROWS()</strong>.</p>
<p>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</p>
<pre class="brush: sql;">
SELECT * FROM tapas WHERE meGusta=true ORDER BY importancia LIMIT 0,25
</pre>
<p>Y así, vale, listo los 25 primeros y luego con</p>
<pre class="brush: sql;">
SELECT * FROM tapas WHERE meGusta=true ORDER BY importancia LIMIT 25,25
</pre>
<p>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é.</p>
<p>A priori parece inevitable hacer antes de nada una consulta con SELECT COUNT para hacer el recuento y luego la consulta SELECT &#8216;oficial&#8217;, pero advierto: *este no es el camino*.</p>
<pre class="brush: php;">
&lt;?php
// Primer SELECT sólo para contar el total
$q = mysql_query(&quot;SELECT COUNT(*) AS rt FROM tapas WHERE meGusta=true&quot;);
$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'] &amp;&amp; $_GET['p']&lt;=$tp)?$_GET['p']:0; // A qué página vamos
$q = mysql_query(&quot;SELECT * FROM tapas WHERE meGusta=true ORDER BY importancia LIMIT &quot;.$p*$rp.&quot;,&quot;.$rp);
while($r=mysql_fetch_array($q))
	{
//	bla, bla, bla...
	}
?&gt;
</pre>
<p><strong>Pero NO. No debemos hacerlo así</strong>. Estaríamos consumiendo recursos inútilmente. Para esto tenemos el dúo <strong>SELECT SQL_CALC_FOUND_ROWS</strong> y <strong>SELECT FOUND_ROWS()</strong></p>
<p>Este SÍ es el camino</p>
<pre class="brush: php;">
&lt;?php
// Todo con un único SELECT
$rp = 25; // Resultados por página
$p = (isset($_GET['p']) &amp;&amp; $_GET['p']&lt;=$tp)?$_GET['p']:0; // A qué página vamos
$q = mysql_query(&quot;SELECT SQL_CALC_FOUND_ROWS * FROM tapas WHERE meGusta=true ORDER BY importancia LIMIT &quot;.$p*$rp.&quot;,&quot;.$rp);
$rt = mysql_fetch_row(mysql_query(&quot;SELECT FOUND_ROWS()&quot;)); // Total de registros
$tp = $rt[0]/$rp; // Total de páginas
echo &quot;&lt;ul&gt;&quot;;
while($r=mysql_fetch_array($q))
	{
	echo &quot;&lt;li&gt;$r[tapa]&lt;/li&gt;;
	}
echo &quot;&lt;/ul&gt;&quot;;
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://quenerapu.com/mysql/me-encanta-select-found_rows/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
