Obtener una fila aleatoria en una consulta de MySQL con RAND()

Para obtener un resultado aleatorio de una tabla en MySQL podemos utilizar la función RAND(),

SELECT *
FROM nombre_tabla
WHERE condicion
ORDER BY RAND()
LIMIT 1;

La función RAND() genera una serie de números aleatorios que irá comprobando contra los registros de nuestra tabla hasta que encuentra uno y lo devuelve (el número de registros devueltos se fija mediante la cláusula LIMIT)

La versión para Drupal:

$sql = "SELECT *
FROM {nombre_tabla}
WHERE condicion
ORDER BY RAND()";
$result = db_query_range($sql,1);
$data = db_fetch_object($result);

Nota: También se puede utilizar RAND(NOW()) o RAND(UNIX_TIMESTAMP())

Esta es una solución ideal para tablas pequeñas, si tenemos problemas de rendimiento, deberemos ser un poco más creativos

Si queremos obtener una fila aleatoria de una tabla mediana-grande, 100.000 registros o más, este método dista de ser óptimo, como explica Anton Titov, para tablas de mayor tamaño es mucho más eficiente generar un número aleatorio limitado y después seleccionar esa fila, por ejemplo:

Para obtener el máximo:
SELECT count(*)
FROM nombre_tabla

Obtenemos (en PHP) un número aleatorio entre 0 y el máximo recuperado antes
$numero = rand(0, $count);

Y seleccionamos la fila a través de ese número:
SELECT count(*)
FROM nombre_tabla
WHERE id = {$numero}

Esto es un supuesto muy concreto porque es imprescindible que el identificador correspondiente al número aleatorio sea parte de la clave primaria de la tabla, de lo contrario, será una solución, por lo menos, igual de lenta que el RAND().
Esta solución tiene un inconveniente muy claro, ya que no limita, si necesitamos filtrar la consulta mediante un WHERE, podemos llegar a la situación de tener que generar varios lotes de números aleatorios hasta que encontremos uno que cumpla con nuestra restricción.

Los comentarios están cerrados.