90 votes

SQLite - ORDRE PAR RAND()

Dans MySQL, je peux utiliser la fonction RAND(), existe-t-il une alternative dans SQLite 3 ?

182voto

avnic Points 1294
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;

57voto

dfa Points 54490

En utilisant aléatoire() :

SELECT foo FROM bar
  WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
  LIMIT 1;

EDIT (par QOP) : Puisque les documents sur Auto-incrémentation SQLite Les colonnes de l'OCDE indiquent que :

L'algorithme normal de sélection des ROWID décrit ci-dessus générera des ROWID uniques à croissance monotone tant que vous n'utilisez pas la valeur maximum de ROWID et que vous ne supprimiez jamais l'entrée de la table avec le le ROWID le plus grand. Si vous supprimez des lignes, les ROWIDs des lignes précédemment des lignes précédemment supprimées peuvent être réutilisés lors de la création de nouvelles lignes. .

Ce qui précède est seulement vrai si vous n'avez pas de INTEGER PRIMARY KEY AUTOINCREMENT (il fonctionnera toujours bien avec la colonne INTEGER PRIMARY KEY colonnes). En tout cas, cela devrait être plus portable / fiable :

SELECT foo FROM bar
  WHERE _ROWID_ >= (abs(random()) % (SELECT max(_ROWID_) FROM bar))
LIMIT 1;

ROWID , _ROWID_ y OID sont tous des alias pour l'identifiant interne de la ligne SQLite.

49voto

Alix Axel Points 63455

Résolu :

SELECT * FROM table ORDER BY RANDOM() LIMIT 1;

37voto

Ali Points 1597

Utilisation de

SELECT * FROM table ORDER BY RANDOM() LIMIT x

a une très mauvaise performance sur les grandes tables. Et la plupart du temps, nous voulons des lignes aléatoires d'un grand tableau. Sur un bon appareil Android (snapdragon 800) avec 100000 lignes, il faut près de 10 secondes pour retourner 50 lignes aléatoires !

Il est beaucoup plus rapide de générer X nombres aléatoires entre 1 et MAX ID, de joindre ces nombres dans une chaîne avec ',' comme séparateur et d'exécuter cette requête :

SELECT * FROM table WHERE id IN (ids)

Pour plus de détails, lisez ceci

http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X