jump to navigation

mySQL y los registros aleatorios, rand() febrero 20, 2006

Posted by NaXo in Bases de datos, mySQL, PHP, Programación.
trackback

Se trata de un concepto bastante sencillo, pero en vez de apuntarmelo en un papel o en un txt de los que tengo ya mil, prefiero dejarlo por aquí.
😀

Muchas veces queremos obtener un listado de registros aleatorio, por ejemplo, para mostrar una serie de imágenes y que no salgan siempre las mismas, para alternar el orden en el blogroll de tu blog, etc…

Supongamos que queremos mostrar 10 registros aleatorios. Lo más intuitivo sería utilizar la siguiente consulta:

$sql = “SELECT * FROM blogroll ORDER BY rand() LIMIT 10”;

La realidad es que con este método no se genera una lista ta aleatoria tal y como uno desearía. Sin embargo, combinándolo con PHP, existe una alternativa sencilla que utiliza la funcion time() y devuelve un resultado realmente aleatorio:

$sql = “SELECT * FROM blogroll ORDER BY rand(” . time() . ” * ” . time() . “) LIMIT 10”;

NOTA: Este método es válido para búsquedas en las que el número de registros no es muy elevado. En caso contrario, es aconsejable usar otra alternativa, que ya comentaré en detalle en otro momento. Por ahora, baste decir que si realizaramos una consulta para listar 10 registros aleatorios en una tabla con 5000 filas, utilizando el primer método se generarían 5000 números aleatorios entre los que, posteriormente, habría que buscar los 10 más pequeños. Imaginen el coste.

[ Vía: scriptygoddess ]

Comentarios»

1. Arathael - junio 14, 2006

Hola, lindo blog.

Se supone que con el Rand() en MySQL se consumen una cantidad de recursos bastante grandes (en tablas grandes) y que es lento pues realiza procesos complicados. Hay alternativas en php para mostrar UN registro aleatorio, pero ¿para mostrar varios sin utilizar Rand()? y otra pregunta: ¿Rand() es combinable con sentencias WHERE?

2. NaXo - junio 15, 2006

Para mostrar varios yo siempre he usado RAND(), así que a bote pronto no sabría que decirte. Investigaré al respecto.

Con respecto a tu otra pregunta, es totalmente válido. La anterior consulta combinada con WHERE podría ser tal que así:

$sql = “SELECT * FROM blogroll WHERE id>10 ORDER BY rand(” . time() . ” * ” . time() . “) LIMIT 10″;

O un ejemplo más sencillo:

“SELECT * FROM tabla WHERE grupo=2 ORDER BY RAND() LIMIT 1”

Espero que al menos esto último te resulte de utilidad.

Saludos!

3. joxxxe - enero 18, 2007

hola porfavor ayuden, y si quiero que sea ordenado alfabeticamente? como podria poner?

tengo este codigo
} else if(@$_REQUEST[‘option’] == “getStartupTracks”){
$query = “SELECT * FROM “.$table_files.” WHERE 1 order by rand() limit 10000;”;

diganme que puedo poner para que salga ordenado alfabeticamente, graciass

4. NaXo - enero 18, 2007

muy buenas,

En teoría basta con añadir un ASC o DESC antes del la palabra reservada LIMIT, en función de si quieres que se ordene de forma ascendente o descendente respectivamente.Por defecto se ordena de forma ascendente, así que el ASC va implícito.

Se puede ordenar por varios campos separando con comas, así que prueba esto y me comentas si te sirvió:

“SELECT * FROM “.$table_files.” WHERE 1 order by rand(), nombre_del_campo DESC limit 10000;”;

Salu2!

5. joxxxe - enero 18, 2007

holaa,,,, gracias por la respuesta pero no carga nada ,,, se queda en blanco la lista, ayuda pliz thankx

mira quiero que esta radio carguen los nombres alfabeticamente🙂
http://www.bautizame.com/radioblog.html

donde dice nombre_del_campo , lo debo reemplazar con algo ? solo copie ese codigo y lo coloque en el lugar donde debe ir y nada , alguna sugerencia?

6. NaXo - enero 19, 2007

Bueno, creo que ha habido un error de concepto. Veamos:

Cuando se utiliza ORDER BY para ordenar los resultados de las búsquedas se pueden especificar varias columnas por las que ordenar, separando el identificador de cada una por comas. El resultado será la lista ordenada por la primera columna, luego por la segunda, etc.

Si por ejemplo una tabla es:

Campo_1 Campo_2 Campo_3
—————————————–
001            A          texto
002            D          texto
003            A          texto
002            B          texto

Y haces un “Order by Campo_1, Campo_2” te lo ordenará así:

001            A          texto
002            B          texto
002            D          texto
003            A          texto

Como ves, primero ordena por la columna Campo_1 y si hay dos filas con el mismo valor en ese campo, ordena por Campo_2.

El problema es que cuando usas el “ORDER BY RAND() LIMIT 10” para obtener 10 filas aleatorias, ya estás ordenando el resultado de la consulta y cogiendo los 10 valores superiores, por lo que si añades un nuevo campo por el que ordenar, va a dar igual, porque cogera primero el RAND()😦

Una solución seria SELECT anidados, pero creo que MySQL lo incorpora a partir de la versión 4.1 y yo tengo una versión algo más antigua aquí instalada, así que no puedo probarlo…

7. joxxxe - enero 19, 2007

puedo mandarte el fichero index.php y modificas el codigo , porfavor realmente lo necesito, cuano lo acabes me lo mandas o lo subes aca y listo http://www.bautizame.com/UploaderPro/index.php porfavor espero tu ayuda men😉

8. joxxxe - enero 20, 2007

aca esta el archivo
http://www.blog.bautizame.com/index.rar

espero que me ayudes,:$

9. Isaac - enero 29, 2007

hola comno estas quiero que me ayunn a construir una base de datos en mysql

10. carolina carvajal - febrero 21, 2007

necesito contar todos los registros ingresasdos a la base de datos cuyos campos sean igual a 01 la sentencia que utilizo es la siguiente y lo que me hace es contar todos los registros sin tomar uno en especifico que en este caso serian todos los asignados a 01
$resultado = mysql_query(“SELECT id_aspirantes, COUNT(id_aspirantes),NNUCLEO,CODNUCLEO FROM nuke_preins2007_opcion, aspirantes GROUP BY NNUCLEO,CODNUCLEO” ,$connexion);

por favor ayudenme lo que deseo es que me cuenten las personas inscritas en cada uno de los nucleos

11. Susan Mortimer - agosto 8, 2007

Hablando y Hablando de todo un poco con mi buen amigo San Google encontre en su charla la solucion de un problema en un trabajo encargado.

Sigan nunca paren de hacer lo que hacen que siempre a alguien ayuda.

Suerte a todos!!!!

12. luis - agosto 18, 2007

esto era lo q buscaba grax

13. McSo - septiembre 1, 2007

Muyyy buenoooo, esta genial

thx

14. Leo - enero 22, 2008

Hola, disculpa necesito poner unas noticias en una pagina que me muestre el ultimo registro de la BD en un formato, y del penultimo hacia atras en un listado. Si logro hacer que me muestre el listado del penultimo hacia atras modificando LIMIT en sql, pero como puedo hacer para que me muetre el primero en un lugar distinto? gracias.

15. jutto - febrero 1, 2008

Hola.
Os plateo el problema, necesito ejecutar una consulta de 10 registros random.hasta aqui ok.
Select * from tabla order by rand()

Y ahora el problema:Quiero volver a ejecutar esta consulta random varias veces.
He intentado pasar la variable resultante de ejecutar mysql_query como variable de sesion pero no funciona.

Gracias de antemano.

16. JF - marzo 4, 2008

porq no guadas las ids en una tabla temporal, donde el id de la tempTable sea = a el session_Id().
Entonces para volver a consultar seria con la sentencia

Select * from tabla where id in (select id from tempTable where idSession = “.session_Id().”)

17. Elmitophp - marzo 27, 2008

Hola muy buenas a todos.

Tengo un problema bastante gordo.
Querria porfavor aver si alguien me alludaria con esto.
Tengo programacion P2P, y quiero crear un bloque de las peliculas y juegos etc las descargas que meta vamos, ese bloque quiero que salgan cada cosa con su imagen en scroll aleatorio.
En esta pedazo de web teneis un gran ejemplo de lo que quiero hacer:
http://www.mundo-p2p.com ai un bloque que pone aleatorios ese bloque lo quiero hacer yo pero no consigo como hacerlo.

si alguien me pudiese alludar con esto le estaria muy agradecido. Gracias.

18. Mathew - abril 7, 2008

necesito hacer una query donde me traiga un unico producto (al azar) de cada categoria. como hago eso?! me estoy rompiendo la cabeza pero no me sale ! gracias.

19. hugo - agosto 9, 2008

Hola, tengo una pagina donde muestra los ultimos 3 usuarios registrados con su icono y nombre, pero quiero que muestre 6, hice el cambio para que muestre 6 pero se muestran todos seguidos y eso hace que se desproporcione mi pagina.

Aparece asi:
user 1 user 2 user 3 user 4 user 5 user 6

y quiero asi:
user 1 user 2 user 3
user 4 user 5 user 6

Como podria hacer eso???

20. Richard - octubre 19, 2008

Tengo 5 millones de registros en una tabla con solo 2 campos (id, valor) y estoy tratando de eliminar valores duplicados (emails), pero MySQL demora mucho en ejexutar la siguiente consulta:

INSERT INTO contactos_temp (id_usuario, email)
SELECT c.id_usuario, c.email
FROM contactos AS c
WHERE c.id_contacto > 0 AND c.id_contacto <= 1000000
GROUP BY c.email ASC

Esa consulta solo me trata 1 millón de registros, pero me tarda mas de 1 minuto :S
Si lo hago con 1.5 Millones me tarda: 245.7058 seg
Si lo hago con 2 millones no termina nunca😦

Mierda!! :S Vaya lentitud…

Pregunta: ¿Obtendría mejores resultados si lo hago con otro sistema gestor de base de datos?

http://cleptomano.com/musica/ << Música Online y mas🙂

21. ciberwap - enero 3, 2009

hola como puedo hacer con la funcion time una funciom alatoria qu muestre cada dia diferentes registros o sea cada dia sea aleatoria un registro

22. vic.tdg - noviembre 13, 2009

Soy super novato en base de datos, pero mi idea seria hacer el random en el lenguaje de programacion usado, primero enviar la sentencia de consultade la cantidad de reistros con esa condicion: select.. count()… from…; de ahi en el lenguaje de programacion yo haria un random, lanzo la consulta a la base de datos y leo solo el que me dio el registro de orden que me da con el random.

23. webdesigni - mayo 28, 2012

http://jisebi.wordpress.com – Many thanks ofr the infofmation.

24. Genesis - enero 23, 2015

te lo agradezco la instrucción me sirvió de mucho en MySql


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: