2010-01-31 7 views
5

¿son compatibles con SQLite sembrar la función RANDOM() la misma manera MySQL hace con RAND()?Siembra SQLite ALEATORIO()

$query = "SELECT * FROM table ORDER BY RAND(" . date('Ymd') . ") LIMIT 1;"; 

Desde el Manual MySQL sobre RAND(N):

Si un argumento entero constante N se especifica, se utiliza como el valor de inicialización , que produce una secuencia repetible de valores de columna . En el siguiente ejemplo , tenga en cuenta que la secuencia de valores producida por RAND (3) es la misma en ambos lugares donde ocurre .

Si no, ¿hay alguna forma de archivar el mismo efecto con solo una consulta?

Respuesta

3

Si usted necesita una orden pseudo-aleatorio, se puede hacer algo como esto (PHP):

$seed = md5(mt_rand()); 
$prng = ('0.' . str_replace(array('0', 'a', 'b', 'c', 'd', 'e', 'f'), array('7', '3', '1', '5', '9', '8', '4'), $seed)) * 1; 
$query = 'SELECT id, name FROM table ORDER BY (substr(id * ' . $prng . ', length(id) + 2)'; 

Además, se puede establecer $ semilla para el valor predefinido y siempre obtener los mismos resultados.

que he aprendido este truco de mi colega http://steamcooker.blogspot.com/

+0

¿Puede usted explicar esta solución? – Luda

+0

Desafortunadamente, esto no se escala muy bien para tablas grandes. –

+0

Luda, lo siento por no responder a tiempo. http://stackoverflow.com/a/24511461/296520 es una buena explicación de lo que sucede allí. – jankkhvej

10

Tenga una mirada en la función sqlite3_randomness():

SQLite contiene un generador de números pseudo-aleatorios de alta calidad (PRNG) que se utiliza para seleccionar ROWIDs al azar al insertar nuevos registros en una tabla que ya utiliza el más grande posible ROWID. El PRNG también se utiliza para las funciones incorporadas random() y randomblob() SQL.

...

La primera vez que se invoca esta rutina (ya sea internamente o por la aplicación) el PRNG es sembrado usando aleatoriedad obtenido a partir del método xRandomness de los sqlite3_vfs objeto predeterminado. En todas las invocaciones posteriores, la pseudoaleatoriedad se genera internamente y sin recurrir al método sqlite3_vfs xRandomness.

En cuanto a la fuente de este método xRandomness, se puede ver que se lee de /dev/urandom en Unix. En Windows, simplemente devuelve los valores devueltos de algunas funciones de tiempo. Parece que tu única opción es comenzar a piratear el código fuente de SQLite.