SQLite - ORDER BY RAND ()
-
12-09-2019 - |
Pregunta
En MySQL puedo utilizar la función RAND (), hay alguna alternativa en SQLite 3?
Solución
usando aleatorio () :
SELECT foo FROM bar
WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
LIMIT 1;
EDIT (por QOP): Desde los docs en SQLite Autoincrement columnas ED señala que:
El algoritmo de selección ROWID normales descritas anteriormente generará aumentando monótonamente ROWIDs únicas , siempre y cuando no utilice el ROWID valor máximo y no se elimina la entrada de la tabla con ROWID más grande. Si alguna vez eliminar filas, luego de ROWIDs previamente filas eliminadas pueden ser reutilizados cuando se crean nuevas filas .
Lo anterior sólo es cierto si usted no tiene una columna INTEGER PRIMARY KEY AUTOINCREMENT
(todavía no tendrán ningún problema con columnas INTEGER PRIMARY KEY
). De todos modos, esto debería ser más portátil / fiable:
SELECT foo FROM bar
WHERE _ROWID_ >= (abs(random()) % (SELECT max(_ROWID_) FROM bar))
LIMIT 1;
ROWID
, _ROWID_
y OID
son todos los alias para la fila SQLite ID interno.
Otros consejos
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
Resuelto:
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
Para un uso mucho mejor rendimiento en esta SQLite:
SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x)
Esto es aplicable a MySQL también. Esto funciona más rápido, porque motores SQL primera carga campos de filas en la memoria proyecta luego ordenarlos , aquí sólo descarga y de clasificación al azar al campo id de filas, entonces obtenemos X de ellos, y encontramos el conjunto de filas de éstos X ids que es de forma predeterminada indexado.