Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL obtém um valor aleatório entre dois valores


Na verdade, ROUND((RAND() * (max-min))+min) é a melhor maneira no MySQL de fazer o que você gostaria. Também é a melhor maneira em ActionScript, JavaScript e Python. Honestamente, eu prefiro o caminho do PHP porque é mais conveniente.

Como não sei quantas linhas você retornará, não posso aconselhá-lo se é melhor usar PHP ou MySQL para isso, mas se você estiver lidando com um grande número de valores, provavelmente será melhor usando o MySQL.

Adendo


Então, havia uma pergunta se isso é melhor em PHP ou MySQL. Em vez de entrar em um debate sobre princípios, fiz o seguinte:
<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;

O MySQL é mais rápido em cerca de 2-3%.

Se você usar isso, no entanto (observe, mais colunas retornam pelo MySQL):
<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;

O MySQL fica atrás por 3-4% (resultados muito inconsistentes) (sobre os mesmos resultados se você não usar uma atribuição de índice de array para $r[2]).

A grande diferença, ao que parece, vem do número de registros retornados ao PHP e não do próprio sistema de randomização. Então, se você precisar de coluna A, coluna B e um valor aleatório, use PHP. Se você precisar apenas do valor aleatório, use o MySQL.