MySQL在两个值之间获取一个随机值
我一行中有两列:, .有没有办法做一个选择,比如:min_value
max_value
SELECT RAND(`min_v`, `max_v`) `foo` [..]
我确实意识到这做了一件不同的事情;我想到的最接近的(在帮助下)是,尽管它会产生一个浮点数,然后我需要ROUND(),这是完全错误的。RAND
(RAND() * (max-min))+min
除非有人能提出替代方案(这将是非常有用的),否则我将采用PHP方式。
我一行中有两列:, .有没有办法做一个选择,比如:min_value
max_value
SELECT RAND(`min_v`, `max_v`) `foo` [..]
我确实意识到这做了一件不同的事情;我想到的最接近的(在帮助下)是,尽管它会产生一个浮点数,然后我需要ROUND(),这是完全错误的。RAND
(RAND() * (max-min))+min
除非有人能提出替代方案(这将是非常有用的),否则我将采用PHP方式。
实际上,这是MySQL中做你想做的事情的最佳方式。这也是ActionScript,JavaScript和Python中最好的方法。老实说,我更喜欢它而不是PHP的方式,因为它更方便。ROUND((RAND() * (max-min))+min)
因为我不知道你会返回多少行,所以我不能建议你使用PHP还是MySQL更好,但是如果你正在处理大量的值,你可能最好使用MySQL。
因此,有一个问题是,这在PHP还是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) 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的速度快了约2-3%。
但是,如果您使用它(请注意,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落后3-4%(非常不一致的结果)(如果你不对$r[2]使用数组索引分配,结果大致相同)。
主要区别在于返回PHP的记录数量,而不是随机化系统本身。因此,如果您需要列 A、列 B 和随机值,请使用 PHP。如果您只需要随机值,请使用MySQL。
此方法保证每个值的统计概率相同:
SELECT FLOOR((RAND() * (max-min+1))+min)