Eigenlijk ROUND((RAND() * (max-min))+min)
is de beste manier in MySQL om te doen wat je wilt. Het is ook de beste manier in ActionScript, JavaScript en Python. Eerlijk gezegd geef ik er de voorkeur aan boven de PHP-manier omdat het handiger is.
Omdat ik niet weet hoeveel rijen je terug zult geven, kan ik je niet adviseren of het beter is om PHP of MySQL hiervoor te gebruiken, maar als je te maken hebt met een groot aantal waarden ben je waarschijnlijk beter af met behulp van MySQL.
Aanvulling
Er was dus een vraag of dit beter is in PHP of MySQL. In plaats van een discussie over principes aan te gaan, heb ik het volgende gedaan:
<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 is ongeveer 2-3% sneller.
Als u dit echter gebruikt (let op, er komen meer kolommen terug door 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 komt 3-4% achter (zeer inconsistente resultaten) (ongeveer dezelfde resultaten als u geen array-indextoewijzing voor $r[2] gebruikt).
Het grote verschil lijkt te komen door het aantal records dat terugkeert naar PHP en niet door het randomisatiesysteem zelf. Dus, als je kolom A, kolom B en een willekeurige waarde nodig hebt, gebruik dan PHP. Als je alleen de willekeurige waarde nodig hebt, gebruik dan MySQL.