Question

En MySQL je peux utiliser la fonction RAND (), est-il une alternative à SQLite 3?

Était-ce utile?

La solution

aléatoire () :

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

EDIT (par QOP): Depuis la documentation sur SQLite Autoincrement colonnes ed indique que:

  

L'algorithme de sélection normal ROWID décrit ci-dessus va générer   de plus en plus de façon monotone ROWIDs uniques aussi longtemps que vous ne jamais utiliser les   valeur maximale ROWID et vous ne supprimez l'entrée dans la table   le plus grand ROWID. Si jamais vous supprimez des lignes, puis de ROWIDs   précédemment lignes supprimées peuvent être réutilisées lors de la création de nouvelles lignes .

Ce qui précède est vrai que si vous ne disposez pas d'une colonne de INTEGER PRIMARY KEY AUTOINCREMENT (il fonctionnera encore avec des colonnes de INTEGER PRIMARY KEY). 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 les alias correspondant à l'ID de ligne interne SQLite.

Autres conseils

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

Résolu:

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

Pour une bien meilleure performance dans ce SQLite:

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

Il est également applicable à MySQL. Cela va plus vite parce que moteurs SQL première charge champs projetés de lignes à la mémoire les trier puis , ici nous venons de charger et tri aléatoire le champ id de lignes, nous obtenons X d'entre eux, et de trouver l'ensemble des lignes de ces X ids qui est par défaut indexé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top