Sebenarnya, ROUND((RAND() * (max-min))+min)
adalah cara terbaik di MySQL untuk melakukan apa yang Anda inginkan. Ini juga merupakan cara terbaik dalam ActionScript, JavaScript, dan Python. Sejujurnya, saya lebih suka cara PHP karena lebih nyaman.
Karena saya tidak tahu berapa banyak baris yang akan Anda kembalikan, saya tidak dapat memberi tahu Anda apakah lebih baik menggunakan PHP atau MySQL untuk ini, tetapi jika Anda berurusan dengan sejumlah besar nilai, Anda mungkin lebih baik menggunakan MySQL.
Tambahan
Jadi, ada pertanyaan apakah ini lebih baik di PHP atau MySQL. Alih-alih berdebat tentang prinsip, saya menjalankan yang berikut:
<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 lebih cepat sekitar 2-3%.
Namun, jika Anda menggunakan ini (perhatikan, lebih banyak kolom yang dikembalikan oleh 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 tertinggal 3-4% (hasil yang sangat tidak konsisten) (hasil yang hampir sama jika Anda tidak menggunakan penetapan indeks array untuk $r[2]).
Perbedaan utama, tampaknya, berasal dari jumlah catatan yang dikembalikan ke PHP dan bukan sistem pengacakan itu sendiri. Jadi, jika Anda membutuhkan kolom A, kolom B, dan nilai acak, gunakan PHP. Jika Anda hanya membutuhkan nilai acak, gunakan MySQL.