Sélectionnez aléatoire ligne(s) dans SQLite
De MySQL, vous pouvez sélectionner les X lignes aléatoires avec la déclaration suivante:
SELECT * FROM table ORDER BY RAND() LIMIT X
Ce n'est pas, cependant, le travail dans SQLite. Est-t-il un équivalent?
Vous devez vous connecter pour publier un commentaire.
Pour beaucoup de meilleures performances utilisation:
SQL moteurs de la première charge projetée champs de lignes à la mémoire, puis de les trier, ici, nous voulons juste faire un tri aléatoire sur les id de champ de chaque ligne qui est en mémoire, car il est indexé, alors X d'entre eux, et de trouver l'ensemble de la ligne à l'aide de ces X id.
Donc cela consomme moins de RAM et CPU comme table grandit!
ORDER BY RANDOM()
? Parce que... je n'ai pas l'impression que c'est vraiment aléatoire... Il y a sérieusement un groupe de lignes très fréquemment choisi... N'est pas n'importe qui ont le même sentiment?SELECT * FROM table ORDER BY RANDOM() LIMIT X
SELECT * FROM table WHERE random() % k = 0 LIMIT n;
. Inconvénient de cette est que les enregistrements avec une baisse des clés primaires obtenir plus de chances d'être sélectionné. depuisToutes les réponses ici sont basées sur
ORDER BY
. C'est très inefficace (c'est à dire inutilisable) pour les grands ensembles parce que vous allez évaluerRANDOM()
pour chaque enregistrement, puisORDER BY
qui est une ressource opération coûteuse.Une autre approche consiste à placer
abs(CAST(random() AS REAL))/9223372036854775808 < 0.5
dans leWHERE
clause d'obtenir dans ce cas par exemple de 0,5 chance de succès.Le grand nombre est la valeur maximale du nombre absolu que
random()
peut produire. Leabs()
est parce qu'il est signé. Le résultat est une variable aléatoire uniformément distribué entre 0 et 1.Cela a ses inconvénients. Vous ne pouvez pas garantir un résultat et si le seuil est grand par rapport à la table, les données sélectionnées seront orientés vers le début de la table. Mais dans certains soigneusement conçu situations, il peut être une option réalisable.
Celui-ci résout le négatif entiers ALÉATOIRES, et conserve de bonnes performances sur de grands ensembles de données:
où:
abs(random() % n )
Vous donne un entier positif dansrange(0,n)