not example avg sql mysql database sqlite random-access

example - SQLite-ORDER BY RAND()



sql server count include 0 (4)

Resuelto

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

En MySQL puedo usar la función RAND (), ¿hay alguna alternativa en SQLite 3?


usando al random() :

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

EDITAR (por QOP): dado que los documentos en columnas SQLite Autoincrement ed afirman que:

El algoritmo de selección de ROWID normal descrito anteriormente generará ROWID únicas y monótonamente crecientes siempre que nunca utilice el valor máximo de ROWID y nunca elimine la entrada en la tabla con el ROWID más grande. Si alguna vez elimina las filas, entonces las ROWID de las filas borradas previamente podrían reutilizarse al crear nuevas filas .

Lo anterior solo es cierto si no tiene una columna INTEGER PRIMARY KEY AUTOINCREMENT (aún funcionará bien con las columnas INTEGER PRIMARY KEY ). De todos modos, esto debería ser más portátil / confiable:

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

ROWID , _ROWID_ y OID son todos alias para la Id. De fila interna de SQLite.


Para un rendimiento mucho mejor, use esto en SQLite:

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

Esto también es aplicable a MySQL. Esto funciona más rápido porque los motores SQL primero cargan campos proyectados de filas en la memoria y luego los clasifican , aquí solo cargamos y ordenamos aleatoriamente el campo de id de filas, luego obtenemos X de ellos, y encontramos las filas completas de estos identificadores X que están indexado por defecto.


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