我连续有两列:min_value,max_value。有没有一种方法可以像这样进行选择:
min_value
max_value
SELECT RAND(`min_v`, `max_v`) `foo` [..]
我确实意识到那RAND是另一回事。我最接近(带有帮助)的是(RAND() * (max- min))+min,尽管它会产生一个浮点数,然后我需要它到ROUND(),这完全是错误的。
RAND
(RAND() * (max- min))+min
除非有人能提出替代方案(这将非常有用),否则我将采用PHP方式。
实际上,这ROUND((RAND() * (max- min))+min)是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。