2009-08-16 10 views
10

Je développe un site Web de quiz, et j'ai une base de données qui stocke toutes les questions. Il existe différents types de quiz, comme les mathématiques, les sciences, l'histoire, etc. Toutes les questions sont stockées dans un tableau.Sélection de lignes aléatoires dans MySQL

Ma table des questions ressemble à ceci:

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

qno est la clé primaire et type est utilisé pour garder la trace du type quiz .:

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

Maintenant, je veux choisir quelques questions aléatoires pour chaque type de test. Par exemple, je pourrais vouloir sélectionner 20 questions aléatoires pour le test de mathématiques seulement.

MySQL peut-il sélectionner des lignes aléatoires?

+0

dup [Comment demander une ligne aléatoire dans SQL?] (Http://stackoverflow.com/q/19412/), [sélection rapide d'une ligne aléatoire à partir d'une grande table dans mysql] (http: // stackoverflow.com/q/211329/90527). – outis

+0

[MySQL sélectionner 10 lignes aléatoires à partir de 600K lignes rapidement] (https://stackoverflow.com/a/4329447/6521116) –

Répondre

19

Vous pouvez utiliser la fonction rand dans MySQL pour classer les lignes, puis prendre le top 10 (ou autant que vous voulez) avec limit.

select * from table order by rand() limit 10 

Si vous voulez seulement les questions de mathématiques:

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

voir je veux montrer à l'utilisateur une question à la fois. Donc je pense est que je vais utiliser la requête ci-dessus lorsque le quiz commence et puis je vais stocker toutes les questions non en session, puis je vais chercher chaque question en utilisant une nouvelle question à chaque fois. Est-ce la bonne approche? – user156073

+0

Si vous voulez juste une question par page, faites juste 'limit 1' au lieu de' limit 10'. – Eric

+0

Stockez les questions que cet utilisateur a vues dans une table, puis construisez cette requête à gauche de cette table et où le champ de la table vue est null. – Unsliced

3

Ajouter une colonne à votre table qui contiendra un horodatage UNIX.

Une fois par jour ou à toute heure qui vous convient, vous lancez une requête qui met à jour cette colonne.

Dans ce cas, votre requête devrait démarrer à minuit et ressembler à ceci.

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

Ensuite, pour récupérer les lignes, vous utilisez une requête similaire à celle-ci.

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

l'aide d'une colonne avec une valeur aléatoire prédéterminée vous épargnerez avoir besoin d'exécuter une fonction de sélection aléatoire pour chaque ligne unique dans la table pour chaque requête à la page.

0

Une autre possibilité est de générer un random permutation, de le stocker dans une session (ou simplement la partie dont vous avez besoin, l'algorithme est facilement adaptable), et d'aller chercher les questions quand vous en avez besoin.

Questions connexes