portable - sqlite website
Seleccione fila(s) al azar en SQLite (4)
En MySQL, puede seleccionar X filas aleatorias con la siguiente instrucción:
SELECT * FROM table ORDER BY RAND() LIMIT X
Sin embargo, esto no funciona en SQLite. ¿Hay un equivalente?
Para un mejor rendimiento, use:
SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x)
Los motores SQL primero cargan campos proyectados de filas en la memoria y luego los clasifican , aquí hacemos un orden aleatorio en el campo de identificación de cada fila que está en la memoria porque está indexado, luego separamos X de ellos, y buscamos toda la fila usando estos identificadores X. .
¡Así que esto consume menos RAM y CPU a medida que la tabla crece!
Todas las respuestas aquí están basadas en ORDER BY
. Esto es muy ineficiente (es decir, inutilizable) para juegos grandes. ¿Por qué no simplemente colocar abs(CAST(random() AS REAL))/9223372036854775808 < 0.5
en la cláusula WHERE
para obtener en este caso 0.5 chance de golpe?
SELECT *
FROM table
WHERE abs(CAST(random() AS REAL))/9223372036854775808 < 0.5
El número grande es el número absoluto máximo que puede producir random()
. El abs()
es porque está firmado. El resultado es una variable aleatoria distribuida uniformemente entre 0 y 1.
SELECT * FROM table ORDER BY RANDOM() LIMIT X
SELECT * FROM table ORDER BY RANDOM() LIMIT 1