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.