Dans MySQL, je peux utiliser la fonction Rand (), existe-t-il une alternative dans SQLite 3?
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.
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
Résolu:
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
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é.