MySQL获得两个值之间的随机值

Gaj*_*jus 35 php mysql

我有一排两列:min_value,max_value.有没有办法做一个像:

SELECT RAND(`min_v`, `max_v`) `foo` [..]
Run Code Online (Sandbox Code Playgroud)

我确实意识到这RAND是另一回事; 我提出的最近(有帮助)是(RAND() * (max-min))+min,虽然它会产生一个浮点数,然后我需要ROUND(),这是完全错误的.

除非有人能提出替代方案(这将非常有用),否则我将采用PHP方式.

cwa*_*ole 64

实际上,ROUND((RAND() * (max-min))+min)MySQL是你做你想做的最好的方式.它也是ActionScript,JavaScript和Python的最佳方式.老实说,我更喜欢PHP方式,因为它更方便.

因为我不知道你要返回多少行,所以我不能告诉你使用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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

MySQL落后3-4%(非常不一致的结果)(如果不为$ r使用数组索引赋值,结果大致相同)[2].

看起来主要区别在于返回PHP的记录数量而不是随机化系统本身.因此,如果您需要列A,列B和随机值,请使用PHP.如果您只需要随机值,那么使用MySQL.


Kar*_*lis 36

此方法保证每个值具有相同的统计概率:

SELECT FLOOR((RAND() * (max-min+1))+min)
Run Code Online (Sandbox Code Playgroud)