SQLite-ORDENAR POR RAND()


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

Author: Alix Axel, 2009-08-10

4 answers

Usando aleatorio():

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

EDIT (by QOP): Desde que los documentos en SQLite Autoincrement ed columnas establece que:

El algoritmo de selección ROWID normal descrito anteriormente generará monótonamente aumentando los ROWIDs únicos siempre y cuando nunca use el valor ROWID máximo y nunca elimina la entrada en la tabla con el ROWID más grande. Si alguna vez elimina filas, entonces ROWIDs de filas eliminadas previamente puede ser reutilizado al crear nuevas filas .

Lo anterior solo es cierto si no tiene una columna INTEGER PRIMARY KEY AUTOINCREMENT (seguirá funcionando 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 los alias para el id de fila interno de SQLite.

 45
Author: dfa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-10 11:26:13
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
 121
Author: avnic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-02 16:33:21

Resuelto:

SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
 35
Author: Alix Axel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-10 07:42:03

Para un rendimiento mucho mejor utilice 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 se ejecuta más rápido porque Los motores SQL primero cargan los campos proyectados de filas en la memoria y luego los ordenan, aquí solo cargamos y ordenamos aleatoriamente el campo id de las filas, luego obtenemos X de ellas y encontramos las filas completas de estos X id que están indexadas por defecto.

 9
Author: Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-12 15:33:57