Recientemente se me ocurrió una idea, estoy seguro de no ser el primero en utilizarla, pero a los coders a ver qué les parece.
Problema: tengo una tabla en una base de datos, indizada con un entero autoincrementable, pero tiene varias características a considerar:
– el id, no necesariamente empieza en 1
– los id’s son discontinuos (por ejemplo, del id 740 sigue el 768, estando vacios los id’s 741-767)
Teniendo en cuenta esto, quiero sacar uno o varios registros aleatoriamente. Supongamos que queremos los campos “nombre
” y “mail
“.
Solución viable ineficiente (la he visto más de alguna vez):
1.- select id from tabla
y meterlos a un arreglo llamado $ids
2.- $id_rand = ids[rand(0,count($ids))]
, además que no me termina de gustar el rand()
de PHP
3.- select nombre, mail from tabla where id = $id_rand
Solución eficiente:
1.- select nombre, mail, rand() as a from tabla [where...] order by a limit 0,n
, donde n es el número de registros aleatorios que queremos (1, 2, …)
Y ya, en un solo paso tenemos los registros aleatorios que gustemos, en vez de tener que traer los id’s, insertarlos a un arreglo gastando memoria de a gratis. Además los problemas de discontinuidad valen madres.
más fácil:
select nombre, mail from tabla order by RAND();
Lo usaste para lo de “5 blogs aleatorios” de la barra lateral? Está bueno.
Y buena solución.
Siempre son más elegantes las soluciones que utilizan una consulta de sql o al menos a mi me gustan más que las soluciones que impliquen el uso de variables auxiliares y dobles consultas …. etc
Órale! Ese spam si me gusta! 😛
jordi: exacto, más sencillo!
rafa: lo siento, pero spam es spam, ahora tendré que ingeniármelas con esas chingaderas (no malas por cierto) pero spam al fin y al cabo.
saffog: ciertamente son además de más bonitas, generalmente más eficientes
No era spam, me encontre el cogido en la pagina en cuestion y solo lo copie a tu pagina para ver que era lo que pasaba…. perdon.
Qué era el spam o que?