sql >> Base de Datos >  >> RDS >> Mysql

MySQL obtiene un valor aleatorio entre dos valores

En realidad, ROUND((RAND() * (max-min))+min) es la mejor manera en MySQL para hacer lo que le gustaría. También es la mejor manera en ActionScript, JavaScript y Python. Honestamente, lo prefiero a PHP porque es más conveniente.

Debido a que no sé cuántas filas devolverá, no puedo aconsejarle si es mejor usar PHP o MySQL para esto, pero si está tratando con una gran cantidad de valores, probablemente esté mejor. utilizando MySQL.

Anexo

Entonces, hubo una pregunta sobre si esto es mejor en PHP o MySQL. En lugar de entrar en un debate sobre principios, ejecuté lo siguiente:

<pre><?php

$c = mysql_connect('localhost', 'root', '');

if(!$c) die('!');
echo mysql_select_db('test', $c)?'Connection':'Failure';
echo PHP_EOL;

echo ':::::::::::::::::::::::::BEGINNING MYSQL RAND::::::::::::::::::::::::::::::'.PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
    $r = mysql_query( 'SELECT ROUND(RAND() * (200-10) + 10) FROM dual' );
    $r = mysql_fetch_array( $r );
}
$end = microtime(1);

echo  ($end - $start) . " for MySQL select".PHP_EOL;

echo ':::::::::::::::::::::::::BEGINNING PHP RAND::::::::::::::::::::::::::::::' .PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
    $r = mysql_query( 'SELECT 200 AS two, 10 AS tem FROM dual' );
    $r = mysql_fetch_array( $r );
    $r[2]= rand($r[0], $r[1]);
}
$end = microtime(1);

echo  ($end - $start) . " for PHP select".PHP_EOL;

MySQL es más rápido entre un 2 y un 3%.

Sin embargo, si usa esto (tenga en cuenta que MySQL devuelve más columnas):

<pre><?php

$c = mysql_connect('localhost', 'root', '');

if(!$c) die('!');
echo mysql_select_db('test', $c)?'Connection':'Failure';
echo PHP_EOL;

echo ':::::::::::::::::::::::::BEGINNING MYSQL RAND::::::::::::::::::::::::::::::'.PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
    $r = mysql_query( 'SELECT ROUND(RAND() * (200-10) + 10) as rd, 200 as two, 10 as ten FROM dual' );
    $r = mysql_fetch_array( $r );
}
$end = microtime(1);

echo  ($end - $start) . " for MySQL select".PHP_EOL;

echo ':::::::::::::::::::::::::BEGINNING PHP RAND::::::::::::::::::::::::::::::' .PHP_EOL;
$start = microtime(1);
for( $i = 0; $i < 100000; $i++ )
{
    $r = mysql_query( 'SELECT 200 AS two, 10 AS tem FROM dual' );
    $r = mysql_fetch_array( $r );
    $r[2]= rand($r[0], $r[1]);
}
$end = microtime(1);

echo  ($end - $start) . " for PHP select".PHP_EOL;

MySQL se queda atrás en un 3-4% (resultados muy inconsistentes) (sobre los mismos resultados si no usa una asignación de índice de matriz para $r[2]).

La principal diferencia, al parecer, proviene de la cantidad de registros devueltos a PHP y no del sistema de aleatorización en sí. Entonces, si necesita la columna A, la columna B y un valor aleatorio, use PHP. Si solo necesita el valor aleatorio, use MySQL.