Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL ottiene un valore casuale tra due valori

In realtà, ROUND((RAND() * (max-min))+min) è il modo migliore in MySQL per fare ciò che desideri. È anche il modo migliore in ActionScript, JavaScript e Python. Onestamente, lo preferisco al modo PHP perché è più conveniente.

Poiché non so quante righe restituirai, non posso consigliarti se è meglio usare PHP o MySQL per questo, ma se hai a che fare con un gran numero di valori probabilmente stai meglio usando MySQL.

Addendum

Quindi, c'era una domanda se questo fosse meglio in PHP o MySQL. Invece di entrare in un dibattito sui principi, ho eseguito quanto segue:

<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 è più veloce di circa il 2-3%.

Se usi questo, tuttavia (nota, più colonne restituiscono da 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;

MySQL risulta indietro del 3-4% (risultati molto incoerenti) (più o meno gli stessi risultati se non utilizzi un'assegnazione dell'indice di matrice per $r[2]).

La differenza principale, a quanto pare, deriva dal numero di record restituiti a PHP e non dal sistema di randomizzazione stesso. Quindi, se hai bisogno della colonna A, della colonna B e di un valore casuale, usa PHP. Se hai solo bisogno del valore casuale, usa MySQL.