<?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>Themes Wordpress - Español - Diseño Web, Themes Wordpress, Recursos Web &#187; thema</title>
	<atom:link href="http://www.web-grafi.com/tag/thema/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.web-grafi.com</link>
	<description>Diseño Web, Themes Wordpress, Recursos Web</description>
	<lastBuildDate>Fri, 28 May 2010 05:36:55 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Infinity Theme</title>
		<link>http://www.web-grafi.com/infinity-theme/</link>
		<comments>http://www.web-grafi.com/infinity-theme/#comments</comments>
		<pubDate>Sat, 23 Aug 2008 18:47:38 +0000</pubDate>
		<dc:creator>web grafi</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordPress Themes]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[com]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tempalte]]></category>
		<category><![CDATA[thema]]></category>
		<category><![CDATA[Theme]]></category>

		<guid isPermaLink="false">http://web-grafi.com/?p=403</guid>
		<description><![CDATA[Infinity Theme (PHP) with PSD sources &#124; RS &#124; 10 MB]]></description>
			<content:encoded><![CDATA[<p><center><img src='http://1.bp.blogspot.com/_kCadDcE-drg/SLBa2MMW2GI/AAAAAAAAA0Q/y8KOc0jPIKg/s400/r4ffbno92omuts8nu13n.jpg' alt='Infinity Theme' class='alignnone' /></p>
<p><strong>Infinity Theme (PHP) with PSD sources | RS | 10 MB</strong></center></p>
<p><a href="http://rapidshare.com/files/139330189/infinity.rar">Rapidshare</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.web-grafi.com/infinity-theme/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TheMafiaMen.com RPG Script</title>
		<link>http://www.web-grafi.com/themafiamencom-rpg-script/</link>
		<comments>http://www.web-grafi.com/themafiamencom-rpg-script/#comments</comments>
		<pubDate>Tue, 19 Aug 2008 14:58:00 +0000</pubDate>
		<dc:creator>web grafi</dc:creator>
				<category><![CDATA[Scripts]]></category>
		<category><![CDATA[com]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[thema]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://web-grafi.com/themafiamencom-rpg-script/</guid>
		<description><![CDATA[

TheMafiaMen.com Script &#124; Size 8.7 Mb

Demo

Download
]]></description>
			<content:encoded><![CDATA[<p><!--1357217262685464257-->
<div style="text-align: center;"><img src="http://i33.tinypic.com/5n3ard.jpg" /></p>
<p>TheMafiaMen.com Script | Size 8.7 Mb</p></div>
<div style="text-align: left;">
<a href="http://anony.110mb.com/?www.bootleggers.us">Demo</a><br />
<span class="fullpost"></p>
<p><a href="http://anony.110mb.com/?http://rapidshare.com/files/138505660/themafiamen.com.rar.html">Download</a></span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.web-grafi.com/themafiamencom-rpg-script/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Mostrar registros aleatorios con PHP MySQL</title>
		<link>http://www.web-grafi.com/mostrar-registros-aleatorios-con-php-mysql/</link>
		<comments>http://www.web-grafi.com/mostrar-registros-aleatorios-con-php-mysql/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 05:02:00 +0000</pubDate>
		<dc:creator>web grafi</dc:creator>
				<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[com]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[página]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[thema]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[ya]]></category>

		<guid isPermaLink="false">http://web-grafi.com/?p=217</guid>
		<description><![CDATA[Mostrar registros aleatorios con PHP MySQL
Seleccion de Registros Aleatorios
Tutorial por Alvaro MartÃ­nez (alvlin) de Alvlin.com

En este tutorial, vamos a ver como obtener registros de forma aleatoria de una base de datos, lo cual tiene diferentes usos: mostrar una imagen de forma aleatoria, mostrar publicidad que sea diferente para cada pÃ¡gina cargada, los enlaces &#8220;artÃ­culo aleatorio&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Mostrar registros aleatorios con PHP MySQL<br />
<h2>Seleccion de Registros Aleatorios</h2>
<p align="right">Tutorial por <strong>Alvaro MartÃ­nez (alvlin)</strong> de <a href="http://www.alvlin.com/" target="_blank">Alvlin.com</a></p>
<div  id="fondogoogle">
<p>En este tutorial, vamos a ver como obtener registros de forma aleatoria de una base de datos, lo cual tiene diferentes usos: mostrar una imagen de forma aleatoria, mostrar publicidad que sea diferente para cada pÃ¡gina cargada, los enlaces &#8220;artÃ­culo aleatorio&#8221; de la Wikipedia, y muchos mÃ¡s.</p>
</div>
<h3>El problema</h3>
<p>
<p>Hay muchos motivos por los que se podr&iacute;a querer obtener registros de forma aleatoria de una base de datos: mostrar una imagen de forma aleatoria, mostrar publicidad que sea diferente para cada p&aacute;gina cargada, los enlaces &quot;art&iacute;culo aleatorio&quot; de la <a href="http://es.wikipedia.org/" target="_blank">Wikipedia</a>, y muchos m&aacute;s.</p>
<p>
<p>El problema es que no existe un m&eacute;todo eficiente dentro del motor de base de datos, por lo que con el tiempo se han ido utilizando diversos m&eacute;todos. Algunos de estos m&eacute;todos son ampliamente usados, otros son simplemente ideas resultado del ingenio de alg&uacute;n programador al que la soluci&oacute;n &quot;ampliamente usada&quot; no le satisfizo.</p>
<p>
<p>En un intento por estudiar el tema, recopil&eacute; algunos m&eacute;todos que me parecieron interesantes.</p>
<p>
<h3> M&eacute;todo 1: &quot;ORDER BY RAND()&quot;</h3>
<p>
<p>Esta es la forma ampliamente usada, no solo en <a href="http://www.mysql.com/" target="_blank">MySQL</a> pero en muchos otros sistemas tambi&eacute;n. Se podr&iacute;a decir que es una soluci&oacute;n &quot;normal&quot; para el problema. Sin embargo, es probablemente la forma m&aacute;s lenta y menos eficiente de hacerlo.</p>
<p>
<p>En la <a href="http://dev.mysql.com/doc/refman/4.1/en/mathematical-functions.html#function_rand" target="_blank">p&aacute;gina del manual de MySQL sobre esta funci&oacute;n</a>, puede leerse:</p>
<p>
<blockquote> <br />
<blockquote> 
<p>Note that RAND() in a WHERE clause is re-evaluated every time the WHERE is executed.</p>
<p> </p></blockquote>
<p></p></blockquote>
<p>
<p>Eso quiere decir que para cada registro que cumple con la condici&oacute;n, se ejecuta una vez la funci&oacute;n RAND(). Y luego, cuando se tienen todos los registros, MySQL los ordena seg&uacute;n el valor que RAND devolvi&oacute; para cada uno.</p>
<p>
<p>Cuando se usa junto a LIMIT, entra en juego lo que se dice en la p&aacute;gina de <a href="http://dev.mysql.com/doc/refman/5.1/en/limit-optimization.html" target="_blank">optimizaci&oacute;n de LIMIT</a>.</p>
<p>
<blockquote> <br />
<blockquote> 
<p>If you use LIMIT row_count with ORDER BY, MySQL ends the sorting as soon as it has found the first row_count rows of the sorted result, rather than sorting the entire result. If ordering is done by using an index, this is very fast. If a filesort must be done, all rows that match the query without the LIMIT clause must be selected, and most or all of them must be sorted, before it can be ascertained that the first row_count rows have been found. In either case, after the initial rows have been found, there is no need to sort any remainder of the result set, and MySQL does not do so.</p>
<p> </p></blockquote>
<p></p></blockquote>
<p>
<p>Lo que esto quiere decir es que MySQL &quot;intenta&quot; detener el proceso de selecci&oacute;n y orden de las filas en cuanto encuentra la cantidad de filas pedidas, sobretodo si la consulta indica buscar y ordenar por un campo &iacute;ndice.</p>
<p>
<p>Pero si necesita hacer un orden extra (como cuando se usa RAND()) no tiene otra opci&oacute;n m&aacute;s que procesar todas las filas de la tabla y ordenar luego, para finalmente devolver el n&uacute;mero de filas pedidas.</p>
<p>
<p>Es la &uacute;nica forma de asegurarse de devolver los X primeros registros.</p>
<p>
<p>El texto indica tambi&eacute;n que MySQL ordena solamente hasta encontrar los primeros X resultados. Si bien esto es una mejora de rendimiento, en general se cumple lo que la p&aacute;gina dice, &quot;most or all of them must be sorted&quot;: &quot;deben ordenarse todos o la mayor&iacute;a&quot; de los registros.</p>
<p>
<p>En tablas grandes puede ser muy lento. Por otro lado, en tablas peque&ntilde;as puede no notarse la diferencia. Pero siempre, en todo caso, es mejor no usar m&eacute;todos que se saben ineficientes.</p>
<p>
<h3> M&eacute;todo 2: Usando COUNT y 2 consultas</h3>
<p>
<p>Este m&eacute;todo funciona bien cuando se necesita solamente 1 registro, o no importa si se obtienen X registros consecutivos partiendo de un registro aleatorio. Hace uso de COUNT(), una funci&oacute;n que devuelve el n&uacute;mero de filas afectadas por la consulta.</p>
<p>
<div class="codigo">SELECT COUNT(*) as cantidad_de_filas FROM tabla WHERE &#8230;..</div>
<p>
<p>Nota: Con el asterisco, COUNT() devuelve el n&uacute;mero de filas afectadas. Tambi&eacute;n puede usarse COUNT(nombre_de_columna), que devuelve el n&uacute;mero filas afectadas en las que el valor almacenado en nombre_de_columna no es nulo.</p>
<p>
<p>El valor de cantidad_de_filas se guarda en una variable, por ejemplo $cantidad.</p>
<p>
<p>Luego, se genera un n&uacute;mero aleatorio entre 0 y $cantidad</p>
<p>
<div class="codigo">$aleatorio = rand(0,$cantidad-1);</div>
<p>
<p>(se usa cantidad -1 porque el n&uacute;mero de resultados se numera de 0 a cantidad -1, en vez de de 1 a cantidad)</p>
<p>
<p>Finalmente:</p>
<p>
<div class="codigo"> SELECT &#8230;.. LIMIT $aleatorio, X</div>
<p>
<p>Cuando X es 1, se devuelve un registro aleatorio, y cuando X es mayor, se devuelven X registros consecutivos, comenzando desde $aleatorio. No es lo mismo que X registros aleatorios, pero sigue siendo m&aacute;s r&aacute;pido que el m&eacute;todo anterior en tablas grandes.</p>
<p>
<p>Cuidado con los casos de borde: si la cantidad total de registros es $resultados, $aleatorio debe ser menor que ($resultados-X) o el &iacute;ndice ser&aacute; rebasado y solo se devolver&aacute;n ($resultados &#8211; $aleatorio) filas.</p>
<p>
<p>Por ejemplo, si el m&aacute;ximo ID ($resultados) es 50 y la consulta queda</p>
<p>
<div class="codigo"> LIMIT 45,10</div>
<p>
<p>Los resultados devueltos ser&aacute;n solamente 5.</p>
<p>
<p>Hay que asegurarse de que el programa sabe manejar esta situaci&oacute;n.</p>
<p>
<h3> M&eacute;todo 3: Generando con PHP los n&uacute;meros aleatorios</h3>
<p>
<p>Este m&eacute;todo requiere conocer el mayor ID de la tabla, esto se puede hacer de 2 formas (al menos):</p>
<p>
<p>Forma 1:</p>
<p>
<div class="codigo">SELECT MAX(id) &#8230;.</div>
<p>
<p>Forma 2 (campos auto increment):</p>
<p>
<div class="codigo">SHOW TABLE STATUS LIKE &#8216;nombre_de_la_tabla&#8217;</div>
<p>
<p>Esta segunda forma solo funciona con MySQL (aunque otros motores tienen m&eacute;todos equivalentes). Devuelve devuelve informaci&oacute;n &quot;administrativa&quot; de la tabla, uno de los campos devueltos es el pr&oacute;ximo auto-increment que se otorgar&aacute; al pr&oacute;ximo registro que se ingrese. Basta reducirlo en 1 para obtener el mayor ID actual.</p>
<p>
<p>El problema es que puede ser que este mayor id no exista por haber sido borrado, pero por contrapartida este m&eacute;todo no necesita leer datos de la tabla, por lo que es m&aacute;s r&aacute;pido.</p>
<p>
<p>Sea cual sea la forma, se guarda el resultado en $max.</p>
<p>
<p>Suponiendo que se necesiten X registros, hay que generar X n&uacute;meros aleatorios entre 1 y $max, para luego juntarlos en una lista separada por comas:</p>
<p>
<div class="codigo">
<p>$aleatorios = array();</p>
<p>
<p>while( sizeof($aleatorios) &lt; X ) {</p>
<p>
<p>$nuevo = rand(0, $max);</p>
<p>
<p>if (!in_array($nuevo, $aleatorios))</p>
<p>
<p>$aleatorios[] = $nuevo;</p>
<p>
<p>}</p>
<p></div>
<p>
<p>$lista = implode(&#8216;,&#8217;, $aleatorios);</p>
<p>
<p>Y finalmente hacer la consulta:</p>
<p>
<div class="codigo"> SELECT &#8230;. WHERE id IN ($lista)</div>
<p>
<p>El problema es que puede ser que algunos ID no existan, por haber sido borrados. Lo que implica que puede suceder que se devuelvan menos de X registros. La soluci&oacute;n a este problema (parcial, ya que a&uacute;n puede caerse en un id faltante) es generar m&aacute;s de X n&uacute;meros (5*X, por ejemplo), dependiendo de qu&eacute; tan &quot;fragmentada&quot; est&eacute; la tabla. La probabilidad dice, sin embargo, que a menos que todos los ID est&eacute;n en su lugar, o se generen $max n&uacute;meros aleatorios, siempre existe la posibilidad de que se devuelvan menos de X registros.</p>
<p>
<p>No estoy seguro de que sea un m&eacute;todo realmente m&aacute;s r&aacute;pido, aunque no es necesario un orden s&iacute; es necesario comparar el ID con cada uno de los X (o X*N) valores (a menos que se lo encuentre antes, claro). Y sigue siendo necesario comprobar en cada paso de la generaci&oacute;n de la lista, que el valor no est&eacute; en la matriz de valores.</p>
<p>
<h3> Conclusi&oacute;n</h3>
<p>
<p>Es decepcionante ver c&oacute;mo hay infinidad de manuales en internet que ense&ntilde;an a hacer esto mismo usando una consulta como</p>
<p>
<div class="codigo"> SELECT * from nombre_tabla ORDER BY RAND() LIMIT 1</div>
<p>
<p>Que es probablemente la peor forma en la que se puede hacer.</p>
<p>
<p>En mi opini&oacute;n, y sin haber hecho pruebas (basicamente por no tener una tabla real lo suficientemente grande), nada mejor que el 2&ordf; m&eacute;todo para obtener un registro aleatorio.</p>
<p>
<p>El 1&ordf; sirve para tablas peque&ntilde;as, mientras que el 3&ordf; m&eacute;todo es un poco menos seguro, ya que no siempre devolver&aacute; la cantidad de registros pedida. Adem&aacute;s de que requiere m&aacute;s trabajo con PHP o con el lenguaje que sea. Sin embargo, evita hacer b&uacute;squedas y ordenamientos innecesarios en MySQL.</p>
<p>
<p>N&oacute;tese que el m&eacute;todo 3 funciona bien siempre y cuando todas las filas de la tabla puedan ser seleccionadas. Incluir una cl&aacute;usula WHERE ser&iacute;a como fragmentar la tabla, disminuyendo la posibilidad de &eacute;xito. Podr&iacute;amos intentar obtener primero los ID de todas las tablas que coincidan con la condici&oacute;n y luego elegir X al azar, pero esto podr&iacute;a tener a&uacute;n peor rendimiento que el m&eacute;todo 1.</p>
<p>
<p>Tengo entendido que en otros <a href="http://es.wikipedia.org/wiki/SGBD" target="_blank">SGBD</a> como <a href="http://www.oracle.com/" target="_blank">Oracle</a>, existe un &iacute;ndice num&eacute;rico y secuencial de todas las filas generado por el gestor. Si existe esa posibilidad, el m&eacute;todo 3 se vuelve ideal y pierde su desventaja principal. No he podido comprobar si esto mismo existe en MySQL, y luego de bastantes b&uacute;squedas asumo que no.</p>
<p>
<p>Pero m&aacute;s all&aacute; de estos &quot;truquitos&quot;, lo importante es intentar optimizar las consultas y aprender sobre c&oacute;mo trabaja el SGBD que se est&eacute; usando. Es imprescindible para una aplicaci&oacute;n eficiente generar los &iacute;ndices que necesite, para evitar que el gestor tenga que buscar en la tabla completa para encontrar lo que la consulta pide.</p>
<p>
<p>El manual de MySQL tiene <a href="http://dev.mysql.com/doc/refman/5.0/es/query-speed.html" target="_blank">una secci&oacute;n dedicada a esto</a> que vale la pena leer. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.web-grafi.com/mostrar-registros-aleatorios-con-php-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
