Dans MySQL, je peux utiliser la fonction RAND(), existe-t-il une alternative dans SQLite 3 ?
Réponses
Trop de publicités?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.
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/