No puede utilizar una columna con un valor RAND() en una cláusula ORDER BY porque ORDER BY volverá a calcular la columna varias veces. Sin embargo, en MySQL3.23, puedes hacer: SELECT * FROM table_name ORDER BY RAND(), lo cual es útil para obtener SELECT * FROM table1,table2 WHERE a=b AND c para lograr aleatoriedad. Encontré lo siguiente en el manual. Declaración para completar la tarea:
SELECCIONAR * DESDE nombre_tabla ORDENAR POR rand() LÍMITE 5;
rand dice esto en el manual::
ALEATORIO()
ALEATORIO(N)
Devuelve un valor de punto flotante aleatorio en el rango de 0 a 1,0. Si se especifica un parámetro entero N, se utiliza como valor inicial.
mysql> seleccione RAND();
-> 0,5925
mysql> seleccione RAND(20);
-> 0,1811
mysql> seleccione RAND(20);
-> 0,1811
mysql> seleccione RAND();
-> 0,2079
mysql> seleccione RAND();
-> 0,7888
No puede utilizar una columna con un valor RAND() en una cláusula ORDER BY porque ORDER BY volverá a calcular la columna varias veces. Sin embargo, en MySQL3.23, puede hacer: SELECT * FROM table_name ORDER BY RAND(), lo cual es útil para obtener SELECT * FROM table1,table2 WHERE a=b AND c
Tenga en cuenta que RAND() en una cláusula WHERE se reevaluará cada vez que se ejecute WHERE.
Pero lo probé. Para una tabla con 8000 registros, se necesitan 0,08 segundos para ejecutarse una vez, lo cual es un poco lento. Posteriormente, consulté Google y obtuve el siguiente código:
SELECCIONAR * DESDE nombre_tabla COMO r1 JOIN (SELECCIONAR RONDA(RAND() * (SELECCIONAR MAX(id) DESDE nombre_tabla)) COMO id) COMO r2 DONDE r1.id >= r2.id ORDENAR POR r1.id ASC LIMIT 5;
La eficiencia de ejecución requiere 0,02 segundos. Desafortunadamente, solo mysql 4.1.* y superiores admiten este tipo de subconsultas.