2009-08-16 15 views
10

Sto sviluppando un sito Web di quiz e ho un database che memorizza tutte le domande. Ci sono diversi tipi di quiz, come matematica, scienze, storia, ecc. Tutte le domande sono memorizzate in una tabella.Selezione di righe casuali in MySQL

Il mio tavolo domande si presenta così:

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

qno è la chiave primaria, e type viene utilizzato per tenere traccia del tipo quiz .:

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

Ora, voglio selezionare alcune domande casuali per ogni tipo di test. Ad esempio, potrei voler selezionare alcune 20 domande casuali per il solo test di matematica.

MySQL ha qualche modo per selezionare righe casuali?

+0

dup di [Come richiedere una riga casuale in SQL?] (Http://stackoverflow.com/q/19412/), [selezione rapida di una riga casuale da una grande tabella in mysql] (http: // stackoverflow.com/q/211329/90527). – outis

+0

[MySQL seleziona 10 righe casuali da 600K righe veloci] (https://stackoverflow.com/a/4329447/6521116) –

risposta

19

È possibile utilizzare la funzione rand in MySQL per ordinare le righe e quindi prendere la top 10 (o comunque molte che si desidera) con limit.

select * from table order by rand() limit 10 

se si desidera solo le domande di matematica:

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

vedi Voglio mostrare all'utente una domanda alla volta. Quindi sto pensando che userò la query sopra quando inizierà il quiz e poi memorizzerò tutte le domande no in session e poi fetterò ogni domanda usando una nuova quesry ogni volta. E 'giusto approccio? – user156073

+0

Se si desidera una sola domanda per pagina, basta 'limite 1' invece di' limite 10'. – Eric

+0

Memorizza le domande che quell'utente ha visto in una tabella e quindi costruisce questa query rimanendo unita a quella tabella e dove il campo della tabella vista è nullo. – Unsliced

3

aggiungere una colonna alla vostra tavola che conterrà un timestamp UNIX.

Una volta al giorno o in qualsiasi momento che lavori per te, si esegue una query che aggiorna quella colonna.

In questo caso, la query deve essere eseguita a mezzanotte e apparire in questo modo.

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

Quindi per recuperare le righe, si utilizza una query simile a questa.

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

Utilizzando una colonna con un valore casuale predeterminato consente di risparmiare la necessità di eseguire una funzione di randomizzazione per ogni singola riga della tabella per ogni singola richiesta alla pagina.

0

Un'altra possibilità è quella di generare un random permutation, memorizzarlo in una sessione (o solo la parte di cui hai bisogno, l'algoritmo è facilmente adattabile) e recuperare le domande quando ne hai bisogno.

Problemi correlati