Ve skutečnosti ROUND((RAND() * (max-min))+min)
je nejlepší způsob, jak v MySQL dělat to, co chcete. Je to také nejlepší způsob v ActionScriptu, JavaScriptu a Pythonu. Upřímně řečeno, preferuji to před cestou PHP, protože je to pohodlnější.
Protože nevím, kolik řádků budete vracet, nemohu vám poradit, zda je pro to lepší použít PHP nebo MySQL, ale pokud máte co do činění s velkým množstvím hodnot, pravděpodobně jste na tom lépe. pomocí MySQL.
Dodatek
Takže byla otázka, zda je to lepší v PHP nebo MySQL. Místo abych se pouštěl do debaty o principech, spustil jsem následující:
<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 je rychlejší asi o 2-3 %.
Pokud však toto použijete (povšimněte si, že MySQL vrátí více sloupců):
<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 zaostává o 3–4 % (velmi nekonzistentní výsledky) (přibližně stejné výsledky, pokud pro $r[2] nepoužijete přiřazení indexu pole).
Zdá se, že hlavní rozdíl pochází z počtu záznamů, které se vrací do PHP, a nikoli z randomizačního systému samotného. Pokud tedy potřebujete sloupec A, sloupec B a náhodnou hodnotu, použijte PHP. Pokud potřebujete pouze náhodnou hodnotu, použijte MySQL.