2010-06-23 5 views
2

Est-il possible d'extraire des lignes aléatoires de la table X où flags == 0? En utilisant MySql et C#Random() Dans MySQL?

+0

Voulez-vous retourner un nombre aléatoire de lignes, ou un nombre fixe de lignes sélectionnés au hasard ? – JohnFx

Répondre

5
SELECT * 
FROM X 
WHERE flags = 0 
ORDER BY rand() 
LIMIT 1 

Cette récupère 1 ligne aléatoire. Remplacer 1 par N pour obtenir N lignes aléatoires. Mise en garde: Comme d'autres l'ont souligné, cela peut être lent car il nécessite un balayage de table complet. J'avais l'habitude de le faire avec DB2, où cela fonctionnait parfaitement pour des tables avec des centaines de milliers de lignes, mais selon le lien dans tereško's answer, MySQL semble se dégrader beaucoup plus rapidement.

+1

Si je ne me trompe pas, cette ligne devrait-elle toujours commander par première ou deuxième rangée? Rand() retournera toujours un nombre entre 0 ou 1 .. donc l'ordre sera par la colonne 0 ou 1? Pas sûr –

+0

sélectionnez Rand() me obtient 0.NUM MAIS en utilisant 'ORDER BY rand()' obtient des résultats complètement aléatoires (je viens de tester avec 4 lignes) –

+0

Selon le manuel de MySQL: Renvoie une valeur à virgule flottante aléatoire v dans l'intervalle 0 <= v <1,0. Donc, non seulement retourner 0 ou 1, mais n'importe quelle valeur entre (virgule flottante). –

1

Vous ne devriez jamais utiliser ORDER BY RAND(). Cela devient vraiment très lent à mesure que la taille de la table augmente. Au lieu de cela, vous devriez read this article.

Si vous avez peur irrationnelle de l'apprentissage, voici la solution là qui ferait ce que vous demandez:

SELECT 
    X.x_id, 
    X.foobar 
FROM X 
    JOIN ( 
    SELECT CEIL(RAND()*(SELECT MAX(x_id) FROM X)) AS x_id 
) AS Choices 
    USING (x_id) 

WHERE X.x_id >= Choices.x_id 
    AND X.flags = 0 

ORDER BY X.x_id LIMIT 1; 
+0

"Jamais, jamais" est un peu extrême, mais bon article quand même. – jordanbtucker