MySQL在两个值之间获取一个随机值

2022-08-30 10:28:20

我一行中有两列:, .有没有办法做一个选择,比如:min_valuemax_value

SELECT RAND(`min_v`, `max_v`) `foo` [..]

我确实意识到这做了一件不同的事情;我想到的最接近的(在帮助下)是,尽管它会产生一个浮点数,然后我需要ROUND(),这是完全错误的。RAND(RAND() * (max-min))+min

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


答案 1

实际上,这是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。


答案 2

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

SELECT FLOOR((RAND() * (max-min+1))+min)

推荐