2010-09-10 3 views
2

Je développe un système qui sélectionne les questions d'une base de données pour générer un test/examen.CHOISIR des résultats 'aléatoires' avec des paramètres définis

Chaque question a un ensemble 'type de question' ('q_type'). J'ai une base de données de questions et j'ai besoin de sélectionner 4 questions, chacune avec un 'q_type' différent.

La requête de base pour sélectionner 4 questions aléatoires à l'heure actuelle est:

SELECT * FROM questions ORDER BY RAND() LIMIT 0,4 

Cela ne prend évidemment pas en compte le fait que chaque question devrait avoir un autre « type_file ».

Je voudrais être en mesure de faire quelque chose qui suit cette logique (je besoin de quelque chose pour remplir les crochets):

SELECT * FROM questions WHERE ['q_type' is DISTINCT] ORDER BY RAND() LIMIT 0,4 

J'ai essayé d'utiliser GROUP BY « type_file », mais qui donne tout simplement la première question pour chaque 'q_type', pas une question différente de ce type à chaque fois.

Toute aide serait super, car je suis complètement perplexe pour le moment (je travaille avec une boucle PHP surchargée qui interroge simplement le DB 4 fois, avec un WHERE 'q_type'! = XX mis à jour à chaque fois).

Merci pour toute aide!

+0

belle saulposel question, j'attends aussi pour toute solution par requête .. :) –

+0

Pour N = 4, vous pouvez vous en sortir avec 4 imbriquée SELECT de. Sélectionnez la 2ème question WHERE q_type! = 1st.q_type, sélectionnez la 3ème question WHERE q_type! = 2nd.q_type ET q_type! = 1st.q_type, etc. Evidemment non-scalable. – MSalters

+0

Je suis d'accord. Comme il ne semble pas y avoir d'option mySQL pure, vous pouvez soit faire 4 requêtes imbriquées comme mentionné ci-dessus, soit faire une boucle mysql_fetch_assoc() comme suggéré par Fanis. C'est purement une décision de performance/échelle. – saulposel

Répondre

1

Je ne pense pas qu'il existe un moyen facile de le faire avec des requêtes simples. Vous pouvez probablement le faire avec une procédure stockée mysql, ou pour économiser du temps de développement en php.

Si le groupe de questions n'est pas quelque chose de très volumineux, et ce n'est pas quelque chose qui arrive trop souvent, vous devriez accepter les 4 requêtes séparées (une pour chaque q_type), ou même obtenir la question entière mettre en PHP, puis jouer avec pour obtenir 4 questions aléatoires, un dans chaque q_type. Avec le code suivant (non testé), vous obtiendrez toutes les questions classées de manière aléatoire et vous passerez en boucle pour obtenir la première question pour chaque type de q, puis arrêter. Ce n'est pas la solution la plus élégante mais, encore une fois, pour des ensembles de données et une fréquence suffisamment petits, cela devrait être acceptable.

$questions = array() ; 
$res = mysql_query('SELECT * FROM questions ORDER BY RAND()') ; 
while ($row = mysql_fetch_assoc($res)) { 

    //if we have all 4, stop 
    if (count($questions) == 4) { 
     break ; 
    } 

    $currType = $row['q_type'] ; 
    $currQuestion = $row['questionTitle'] ; 

    if (isset($questions[$currType])) { 
     //already have it, continue to the next 
     continue ; 
    } 

    $questions[$currType] = $currQuestion ; 

} 
+0

si (comme il semble) il n'y a pas de fonctionnalité mySQL directe pour le faire alors en fonction du nombre total de questions par rapport au nombre de questions nécessaires, alors vous faites des requêtes individuelles ou vous bouclez comme vous l'avez suggéré. Je suppose que c'est une décision de performance. Merci pour le code mysql_fetch_assoc() suggéré, je n'ai pas utilisé 'continue' et 'break' dans une boucle mysql_fetch_array avant. – saulposel

0

Je ne suis en aucun cas un expert SQL mais cela fonctionne-t-il?

SELECT DISTINCT `q_type`, * FROM questions ORDER BY RAND() LIMIT 0, 4 
+0

curieusement, j'ai essayé, mais ce n'est pas une syntaxe valide. Vous ne pouvez apparemment pas SELECT DISTINCT suivi d'un autre paramètre SELECT. – saulposel

Questions connexes