2009-08-16 30 views
10

Estoy desarrollando un sitio web de prueba, y tengo una base de datos que almacena todas las preguntas. Existen diferentes tipos de cuestionarios, como matemática, ciencia, historia, etc. Todas las preguntas se guardan en una sola tabla.Selección de filas aleatorias en MySQL

Mi mesa de preguntas es el siguiente:

questions (qno(int) ,type(int), question, .... ,...) 

qno es la clave principal y type se utiliza para realizar un seguimiento del tipo cuestionario .:

if type = 1 (math) 
type = 2(science) 

Ahora, yo quiero para seleccionar algunas preguntas al azar para cada tipo de prueba. Por ejemplo, es posible que desee seleccionar algunas 20 preguntas al azar solo para la prueba de matemáticas.

¿Tiene MySQL alguna manera de seleccionar filas aleatorias?

+0

dup de [¿Cómo solicitar una fila aleatoria en SQL?] (Http://stackoverflow.com/q/19412/), [selección rápida de una fila aleatoria de una tabla grande en mysql] (http: // stackoverflow.com/q/211329/90527). – outis

+0

[MySQL selecciona 10 filas aleatorias de 600K filas más rápido] (https://stackoverflow.com/a/4329447/6521116) –

Respuesta

19

Puede usar la función rand en MySQL para ordenar las filas, y luego tomar las 10 principales (o las que desee) con limit.

select * from table order by rand() limit 10 

Si desea sólo las preguntas de matemáticas:

select * from table where type = 1 order by rand() limit 10 
+0

veo que quiero mostrar al usuario una pregunta a la vez. Así que estoy pensando es que usaré la consulta anterior cuando comience el cuestionario y luego almacenaré toda la pregunta no en sesión y luego responderé a cada pregunta utilizando un nuevo cuestionario cada vez. ¿Es el enfoque correcto? – user156073

+0

Si solo desea una pregunta por página, simplemente haga 'limit 1' en vez de' limit 10'. – Eric

+0

Almacena las preguntas que ese usuario ha visto en una tabla y luego crea esta consulta que se une a esa tabla y donde el campo de la tabla vista es nulo. – Unsliced

3

agregar una columna a la tabla que llevará a cabo una marca de tiempo UNIX.

Una vez al día o en cualquier período de tiempo que funcione para usted, ejecute una consulta que actualice esa columna.

En este caso, su consulta debería ejecutarse a la medianoche y se vería algo como esto.

UPDATE table SET rand_id = (UNIX_TIMESTAMP() + (RAND() * 86400)); 

Luego, para recuperar las filas, utilice una consulta similar a esta.

SELECT * FROM table WHERE rand_id > UNIX_TIMESTAMP() ORDER BY rand_id ASC LIMIT 20 

utilizando una columna con un valor aleatorio predeterminado le ahorra tener que ejecutar una función de aleatorización para cada fila única en la tabla para cada petición de la página.

0

Otra posibilidad es generar un random permutation, almacenar esto en una sesión (o solo la parte que necesita, el algoritmo es fácilmente adaptable), y obtener las preguntas cuando las necesite.

Cuestiones relacionadas