web-dev-qa-db-fra.com

SQLite - ORDER BY Rand ()

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

64
Alix Axel

en utilisant random () :

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

EDIT (par QOP): Puisque les documents sur SQLite Autoincrement ed colonnes indiquent que:

L'algorithme de sélection ROWID normal décrit ci-dessus générera des ROWID uniques augmentant de façon monotone tant que vous n'utilisez jamais la valeur ROWID maximale et que vous ne supprimez jamais l'entrée dans le tableau avec le ROWID le plus grand. Si vous supprimez des lignes, les ROWID 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 n'est vrai que si vous n'avez pas de INTEGER PRIMARY KEY AUTOINCREMENT colonne (cela fonctionnera toujours bien avec INTEGER PRIMARY KEY Colonnes). Quoi qu'il en soit, cela devrait être plus portable/fiable:

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

ROWID, _ROWID_ et OID sont tous des alias pour l'ID de ligne interne SQLite.

49
dfa
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
126
avnic

Résolu:

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

Pour de bien meilleures performances, utilisez ceci dans SQLite:

SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x) 

Ceci s'applique également à MySQL. Cela s'exécute plus rapidement car les moteurs SQL chargent d'abord les champs de lignes projetés dans la mémoire, puis les trient, ici nous chargeons et trions au hasard le champ id des lignes, puis nous en obtenons X et trouvons les lignes entières de ces X id qui est par défaut indexé.

13
Ali